這段時間獲得一份源碼,是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: ‘string’ in 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