windows c++ 程序移植到Linux的一些要點

這段時間獲得一份源碼,是Windows下的,調試了一把,能夠正常運行,但是沒有Linux版本,而實際的應用場景是要在Linux服務器上面運行html

因此涉及到Windows下c++程序的移植,有同事竭力推薦我使用boost庫,緣由很簡單,boost已經實現了兩個系統差別的屏蔽,一套代碼,兩個系統運行linux

另外一些沒有屏蔽的就是要點,總結了部分c++

1.庫的加載git

在windows中能夠用  #pragma comment(lib,  ...  express

#ifdef WIN32
#pragma comment(lib, "osip2.lib")
#pragma comment(lib, "osipparser2.lib")
#pragma comment(lib, "eXosip.lib")
#pragma comment(lib, "InterProtocol.lib")
#pragma comment(lib, "tinyxml.lib")
#else
在linux中不行,須要直接編譯的時候連接動態庫
因此改寫以下

 

gcc -gbserver data.c -leXosip2 -ljrtp -ljthread -losip2 -losipparser2 -ltinyxml

2.頭文件的路徑問題windows

  windows支持兩種方式服務器

#include "eXosip2/eXosip.h"

 

#include "eXosip2\eXosip.h"

都支持dom

而Linux只支持svn

#include "eXosip2/eXosip.h"

3.Linux編譯的時候通常不用指定庫的類型,通常會在指定的庫前面加lib,優先加載動態庫,而後再找靜態庫,可是通常要指定庫的路徑函數

gcc -std=gnu++11 -ggdb3
 Instance.cpp  jyzbyj.lnp.GbClientSdk.cpp  Session.cpp Sip.cpp  
-fPIC -shared -o libgbclientsdk.so -L /usr/local/lib 
-I /home/jyzbyj/mjl/jyzbyj.lnp.GbClientSdk -I /usr/include 
-leXosip2  -ljrtp  -ljthread -losip2  -losipparser2   -ltinyxml 
-lboost_system -lboost_filesystem -lpthread -lboost_thread

如-ljrtp,先會到/usr/local/lib(-L /usr/local/lib 指定庫路徑),系統目錄,去找libjrtp.so,若是沒找到,再去找librtp.a,至於網上說的Wl,-Bstatic  -Wl,-Bdynamic 指定庫其實很不實用,會影響,默認加載的一些系統庫的類型

4.編譯庫的時候必定要記得加上-fPIC,拷貝的庫最好用cp -df

 

relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC

保證你編譯.o文件的時候,都加上-fPIC,這樣你才能編譯出動態庫來。

 

錯誤:

In file included from ../common/algo_object_template/algo_mgr_image_file_path.h:7:0,
                 from ../common/algo_object_template/algo_mgr_image_file_path.cpp:2:
/usr/include/c++/4.8/string:38:28: fatal error: bits/c++config.h: 沒有那個文件或目錄
 #include <bits/c++config.h>

 解決:

 -I /usr/include/c++/4.6/x86_64-linux-gnu (無效)

 CFLAGS=-m32 -fpic 改成CFLAGS=-m64 -fpic ,CFLAGS+=  -W  -O0 -fexceptions -g  -fno-inline 

添加

-I /usr/include/c++/4.8(正常)

通常 CFLAGS=-m64(64位) CFLAGS=-m32(32位)

 

 

 錯誤

  ‘nullptr’ was not declared in this scope

 提示
 -std=c++11
 -std=gnu++0x

 CFLAGS=-m64 -fpic  -std=gnu++0x (解決)

 

 

 問題

  error: ‘stringin namespace ‘std’ does not name a type
  std::string AlgoName;

很明顯,缺乏一個

#include<string> (解決)

 

  問題

 error: ‘strcpy_s’ was not declared in this scope

‘strcpy_s’改strncpy 正常

 

問題

goto _ERR_
error: jump to label ‘_ERR_’ [-fpermissive]
 _ERR_:

 定義成宏(解決)

 

問題

../common/data_stream_chr/ffmpeg_stream_chr.cpp:65:2: error: ‘AVCodecParameters’ was not declared in this scope
  AVCodecParameters *enc = format_context_->streams[i]->codecpar;

  頭文件路徑不對 ,修改正常

 

問題

algo_object_template/task_work_object_thread.cpp:19:65: error: invalid use of incomplete type ‘class boost::interprocess::interprocess_semaphore’
  m_Semaphore = new boost::interprocess::interprocess_semaphore(0);  

  Makefile以下,由於interprocess庫不依賴庫,因此頭文件只須要包含boost頂層目錄便可,僅依賴系統庫編輯時須要指定-lrt.

  ../common/main_orderlies_thread/main_orderlies_thread.cpp: In member function ‘virtual bool MainTread::Init(int)’:
../common/main_orderlies_thread/main_orderlies_thread.cpp:24:65: error: invalid use of incomplete type ‘class boost::interprocess::interprocess_semaphore’
  m_Semaphore = new boost::interprocess::interprocess_semaphore(0);

這個問題一直沒有解決,最後本身實現信號量才能正常編譯經過

 

 

問題

/ffmpeg-3.2.2/include/libavcodec/avcodec.h:34:30: fatal error: libavutil/buffer.h: 沒有那個文件或目錄
 #include "libavutil/buffer.h"

連接的版本頭文件不對,直接指定頭文件目錄
 添加 -I /usr/local/include_ffmpeg57  解決

 

問題

g++: error: ...o: 沒有那個文件或目錄
g++: error: .o: 沒有那個文件或目錄
g++: error: ...o: 沒有那個文件或目錄
make[1]: *** [AlgoMgr.out] 錯誤 1
make[1]:正在離開目錄 `/home/user/mjl/algo/AlgoControlCenterFramework_git_svn/algo_control_center_framework/algo_mgr_client'
make: *** [AlgoMgrClient] 錯誤 2

重複屢次引用 刪除多餘的引用,解決

 

問題

/usr/bin/ld: logger-cs.o: undefined reference to symbol 'pthread_rwlock_wrlock@@GLIBC_2.2.5'
//lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

-lpthread -lboost_thread 解決

 

 

問題

 

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o:在函數‘_start’中:
(.text+0x20):對‘main’未定義的引用

添加編譯文件XXX.cpp ,正常,XXX.cpp包含main()

 

 

問題

 

logger-cs.o:在函數‘Logger::init(int, std::string, Logger::LogLevel, Logger::LogLevel)’中:
common/base/logger-cs.cpp:107:對‘boost::log::v2s_mt_posix::sinks::file::rotation_at_time_point::rotation_at_time_point(unsigned char, unsigned char, unsigned char)’未定義的引用
logger-cs.cpp:112:對‘boost::log::v2s_mt_posix::core::get()’未定義的引用
logger-cs.cpp:112:對‘boost::log::v2s_mt_posix::core::add_global_attribute(boost::log::v2s_mt_posix::attribute_name const&, boost::log::v2s_mt_posix::attribute const&)’未定義的引用
logger-cs.o:在函數‘boost::log::v2s_mt_posix::attribute_name::attribute_name(char const*)’中:
/usr/include/boost/log/attributes/attribute_name.hpp:80:對‘boost::log::v2s_mt_posix::attribute_name::get_id_from_string(char const*)’未定義的引用
logger-cs.o:在函數‘boost::log::v2s_mt_posix::aux::attribute_set_reference_proxy::operator=(boost::log::v2s_mt_posix::attribute const&) const’中:
/usr/include/boost/log/attributes/attribute_set.hpp:484:對‘boost::log::v2s_mt_posix::attribute_set::insert(boost::log::v2s_mt_posix::attribute_name, boost::log::v2s_mt_posix::attribute const&)’未定義的引用
logger-cs.o:在函數‘boost::log::v2s_mt_posix::record::reset()’中:
/usr/include/boost/log/core/record.hpp:153:對‘boost::log::v2s_mt_posix::record_view::public_data::destroy(boost::log::v2s_mt_posix::record_view::public_data const*)’未定義的引用
logger-cs.o:在函數‘boost::log::v2s_mt_posix::aux::once_block_sentry::~once_block_sentry()’中:
/usr/include/boost/log/utility/once_block.hpp:85:對‘boost::log::v2s_mt_posix::aux::once_block_sentry::rollback()’未定義的引用
logger-cs.o:在函數‘boost::log::v2s_mt_posix::aux::once_block_sentry::executed() const’中:
/usr/include/boost/log/utility/once_block.hpp:90:對‘boost::log::v2s_mt_posix::aux::once_block_sentry::enter_once_block() const’未定義的引用
logger-cs.o:在函數‘boost::log::v2s_mt_posix::expressions::tag::message::get_name()’中:
/usr/include/boost/log/expressions/message.hpp:56:對‘boost::log::v2s_mt_posix::aux::default_attribute_names::message()’未定義的引用

 


添加-lboost_thread -DBOOST_LOG_DYN_LINK -lboost_log_setup -lboost_log
boost\log\detail 裏面的config.hpp

#   if defined(BOOST_LOG_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)
#        define BOOST_LOG_DLL
#   endif

#   if defined(BOOST_LOG_DLL)
#       if defined(BOOST_SYMBOL_IMPORT)
#           define BOOST_LOG_API BOOST_SYMBOL_IMPORT
#       elif defined(BOOST_HAS_DECLSPEC)
#           define BOOST_LOG_API __declspec(dllimport)
#       endif
#   endif
#   ifndef BOOST_LOG_API
#       define BOOST_LOG_API
#   endif

仍是依然報錯

https://www.cnblogs.com/oloroso/p/4688426.html

主要是一個文件之間存在依賴關係的話,放的順序很重要

 

問題

 

:80:對‘avcodec_parameters_to_context’未定義的引用
:85:對‘avcodec_free_context’未定義的引用
:102:對‘av_frame_alloc’未定義的引用
ffmpeg_stream_chr.o:在函數‘FfmpegStreamChr::DecodeToImage()’中:
:305:對‘av_packet_unref’未定義的引用
:311:對‘avcodec_send_packet’未定義的引用
:313:對‘avcodec_receive_frame’未定義的引用
:322:對‘av_packet_unref’未定義的引用
:334:對‘av_packet_unref’未定義的引用
:336:對‘av_frame_unref’未定義的引用
:351:對‘av_packet_unref’未定義的引用
:352:對‘av_frame_unref’未定義的引用
:360:對‘av_packet_unref’未定義的引用
ffmpeg_stream_chr.o:在函數‘FfmpegStreamChr::Close()’中:
:414:對‘av_frame_free’未定義的引用
:419:對‘avcodec_free_context’未定義的引用

 

連接庫錯誤 -L 應該連接/usr/local/lib_ffmpeg57 實際上連接到了/usr/lib/x86_64-linux-gnu裏面的公用庫,前置/usr/local/lib_ffmpeg57便可 -L /usr/local/lib_ffmpeg57 -L /usr/local/lib/x86_64-linux-gnu -L /usr/lib/x86_64-linux-gnu


問題
/usr/local/lib/libliveMedia.so:對‘AddressString::AddressString(in_addr const&)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘NetAddressList::NetAddressList(char const*)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘makeSocketNonBlocking(int)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘Groupsock::Groupsock(UsageEnvironment&, in_addr const&, Port, unsigned char)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘AddressString::~AddressString()’未定義的引用
/usr/local/lib/libliveMedia.so:對‘IsMulticastAddress(unsigned int)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘Groupsock::wasLoopedBackFromUs(UsageEnvironment&, sockaddr_in&)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘AddressPortLookupTable::Add(unsigned int, unsigned int, Port, void*)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘AddressPortLookupTable::AddressPortLookupTable()’未定義的引用
/usr/local/lib/libliveMedia.so:對‘Groupsock::multicastSendOnly()’未定義的引用
/usr/local/lib/libliveMedia.so:對‘increaseReceiveBufferTo(UsageEnvironment&, int, unsigned int)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘makeSocketBlocking(int, unsigned int)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘NoReuse::~NoReuse()’未定義的引用
/usr/local/lib/libliveMedia.so:對‘AddressPortLookupTable::Iterator::next()’未定義的引用
/usr/local/lib/libliveMedia.so:對‘Groupsock::changeDestinationParameters(in_addr const&, Port, int, unsigned int)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘AddressPortLookupTable::Iterator::Iterator(AddressPortLookupTable&)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘our_inet_addr’未定義的引用
/usr/local/lib/libliveMedia.so:對‘Groupsock::Groupsock(UsageEnvironment&, in_addr const&, in_addr const&, Port)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘NetAddress::operator=(NetAddress const&)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘AddressPortLookupTable::Lookup(unsigned int, unsigned int, Port)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘NetAddress::NetAddress(unsigned int)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘NetAddress::~NetAddress()’未定義的引用
/usr/local/lib/libliveMedia.so:對‘NetAddressList::~NetAddressList()’未定義的引用
/usr/local/lib/libliveMedia.so:對‘SendingInterfaceAddr’未定義的引用
/usr/local/lib/libliveMedia.so:對‘AddressPortLookupTable::Remove(unsigned int, unsigned int, Port)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘NetAddressList::firstAddress() const’未定義的引用
/usr/local/lib/libliveMedia.so:對‘AddressString::AddressString(sockaddr_in const&)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘ignoreSigPipeOnSocket(int)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘setupStreamSocket(UsageEnvironment&, Port, unsigned char)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘ReceivingInterfaceAddr’未定義的引用
/usr/local/lib/libliveMedia.so:對‘getSourcePort(UsageEnvironment&, int, Port&)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘AddressString::AddressString(unsigned int)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘readSocket(UsageEnvironment&, int, unsigned char*, unsigned int, sockaddr_in&)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘Groupsock::removeAllDestinations()’未定義的引用
/usr/local/lib/libliveMedia.so:對‘increaseSendBufferTo(UsageEnvironment&, int, unsigned int)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘our_random32’未定義的引用
/usr/local/lib/libliveMedia.so:對‘Socket::reset()’未定義的引用
/usr/local/lib/libliveMedia.so:對‘AddressPortLookupTable::Iterator::~Iterator()’未定義的引用
/usr/local/lib/libliveMedia.so:對‘ourIPAddress(UsageEnvironment&)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘our_random’未定義的引用
/usr/local/lib/libliveMedia.so:對‘Port::Port(unsigned short)’未定義的引用
/usr/local/lib/libliveMedia.so:對‘NoReuse::NoReuse(UsageEnvironment&)’未定義的引用
網上說是連接順序的問題 變換順序爲-lliveMedia -lBasicUsageEnvironment -lgroupsock -lUsageEnvironment 正常

 

 

若是以爲還能夠,打賞地址

BTC: 1GYhFurFFWq4Ta9BzFKx961EKtLhnaVHRc

ETH: 0xe54AbD803573FDD245f0Abb75f4c9Ddfc8e72050

相關文章
相關標籤/搜索