这段时间得到一份源码,是Windows下的,调试了一把,可以正常运行,可是没有Linux版本,而实际的应用场景是要在Linux服务器上面运行

所以涉及到Windows下c++程序的移植,有同事竭力推荐我使用boost库,原因很简单,boost已经实现了两个系统差异的屏蔽,一套代码,两个系统运行

另一些没有屏蔽的就是要点,总结了部分

1.库的加载

在windows中可以用  #pragma comment(lib,  ...

#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支持两种方式

#include "eXosip2/eXosip.h"
#include "eXosip2\eXosip.h"

都支持

而Linux只支持

#include "eXosip2/eXosip.h"

3.Linux编译的时候一般不用指定库的类型,一般会在指定的库前面加lib,优先加载动态库,然后再找静态库,但是一般要指定库的路径

gcc -std=gnu++ -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::,
from ../common/algo_object_template/algo_mgr_image_file_path.cpp::
/usr/include/c++/4.8/string::: 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::: error: ‘AVCodecParameters’ was not declared in this scope
AVCodecParameters *enc = format_context_->streams[i]->codecpar;

头文件路径不对 ,修改正常

问题

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

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::: error: invalid use of incomplete type ‘class boost::interprocess::interprocess_semaphore’
m_Semaphore = new boost::interprocess::interprocess_semaphore();

这个问题一直没有解决,最后自己实现信号量才能正常编译通过

问题

/ffmpeg-3.2./include/libavcodec/avcodec.h::: 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 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::对‘boost::log::v2s_mt_posix::sinks::file::rotation_at_time_point::rotation_at_time_point(unsigned char, unsigned char, unsigned char)’未定义的引用
logger-cs.cpp::对‘boost::log::v2s_mt_posix::core::get()’未定义的引用
logger-cs.cpp::对‘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::对‘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::对‘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::对‘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::对‘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::对‘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::对‘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

主要是一个文件之间存在依赖关系的话,放的顺序很重要

问题

::对‘avcodec_parameters_to_context’未定义的引用
::对‘avcodec_free_context’未定义的引用
::对‘av_frame_alloc’未定义的引用
ffmpeg_stream_chr.o:在函数‘FfmpegStreamChr::DecodeToImage()’中:
::对‘av_packet_unref’未定义的引用
::对‘avcodec_send_packet’未定义的引用
::对‘avcodec_receive_frame’未定义的引用
::对‘av_packet_unref’未定义的引用
::对‘av_packet_unref’未定义的引用
::对‘av_frame_unref’未定义的引用
::对‘av_packet_unref’未定义的引用
::对‘av_frame_unref’未定义的引用
::对‘av_packet_unref’未定义的引用
ffmpeg_stream_chr.o:在函数‘FfmpegStreamChr::Close()’中:
::对‘av_frame_free’未定义的引用
::对‘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

windows c++ 程序移植到Linux的一些要点的更多相关文章

  1. windows c++程序移植到linux的要点

    这段时间得到一份源码,是Windows下的,调试了一把,可以正常运行,可是没有Linux版本,而实际的应用场景是要在Linux服务器上面运行 所以涉及到Windows下c++程序的移植,有同事竭力推荐 ...

  2. 如何利用mono把.net windows service程序迁移到linux上

    How to migrate a .NET Windows Service application to Linux using mono? 写在最前:之所以用要把windows程序迁移到Linux上 ...

  3. windows下系统移植到linux下出现的问题

    今天遇到了一个之前没有遇到的问题,记录一下. 我们是在windows下进行开发的,最终系统是部署在linux服务器上. 在windows一切正常,但是部署到linux下时,有些功能不能用了.通过log ...

  4. C/C++ Windows移植到Linux

    近期写了有关Socket的程序,需要从windows移植到linux.现把有用的东东收集整理记录下来. 1.头文件windows下winsock.h或winsock2.h:linux下netinet/ ...

  5. 【转】将 Linux 应用程序移植到 64 位系统上

    原文网址:http://www.ibm.com/developerworks/cn/linux/l-port64.html 随着 64 位体系结构的普及,针对 64 位系统准备好您的 Linux® 软 ...

  6. WIN 程序员的 Linux 互斥类

    作者:黄山松,发表于cnblogs:http://www.cnblogs.com/tomview/ 对于一个 win 的程序员,要把在 win 下的程序移植到 linux 下,需要把一些平台相关的功能 ...

  7. 虹软人脸识别——官方 Qt Demo 移植到 Linux

    一.前言 最近需要在 Linux 平台下开发一个人脸识别相关的应用,用到了虹软的人脸识别 SDK.之前在 Windows 平台用过,感觉不错,SDK 里面还带了 Demo 可以快速看到效果.打开 Li ...

  8. Socket程序从windows移植到linux下需要注意的

    )头文件 windows下winsock.h或winsock2.h linux下netinet/in.h(大部分都在这儿),unistd.h(close函数在这儿),sys/socket.h(在in. ...

  9. 一些遇到的Qt程序在Windows平台间移植问题整理

    今天尝试把Qt程序移植到各种虚拟机中测试,由于Qt的依赖库报告往往不能显示出全部依赖库.结果频频出现问题,好不容易全部解决了,这里给出一些套路. 首先对于Qt版本,我用过很多,最终表示现阶段推荐Min ...

随机推荐

  1. 51Nod 1090 3个数和为0 set 二分优化

    给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等.从中找出所有和 = 0的3个数的组合.如果没有这样的组合,输出No Solution.如果有多个,按照3个数中最小的数从小到 ...

  2. HDU3790-最短路径问题

    最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. 五十个小技巧提高PHP执行效率(二)

    更详细具体的总结如下: 1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的 ...

  4. 计算rem

    (function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? ' ...

  5. 【福利】十一起,小冰科技所有UWP产品免费半个月

    从十月一日起(UTC协调世界时),至十月十五,小冰科技所有UWP产品免费半个月!!!!!! 注意是UTC哦,中国区,比UTC早8个小时,要等到十月一号早晨八点开始... 现在小冰科技旗下一共发布了 5 ...

  6. 高精速撸project A*B

    啊这个乘法我真的想不起来了 所以我跑去看了之前交的代码 那个时候的我真纯真啊,用cin cout都不关同步的 哪像现在,随手先写个inline void in(),能getchar()就不scanf, ...

  7. 关于C#中函数声明带参数的函数

    在C#语言的函数中,有一项至关重要的我们称之为参数. 对于参数的含义:要完成一件事,需要知道的额外条件 其语法: static void 函数名(参数列表){ //注释类容} 而其参数列表的语法为: ...

  8. java学习笔记IO之File类

    File类总结 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Times } p.p2 { margin: 0.0px 0.0px 0.0p ...

  9. Chrome浏览器调试技巧

    本文主要讲解针对chrome浏览器的调试方案,对于其他浏览器其实大同小异. 先来入门一点的 DOM元素调试 看上图: 以上图表明的1,2,3,4,5标记说明: 1,为移动设备模拟器,chorme现在是 ...

  10. 10.0.0.55训练赛 Writeup

    From LB@10.0.0.55 Misc 0x01 misc100(图片隐写) 首先用binwalk扫了一下,发现没毛病. 然后就搜了一下jpg的文件尾FFD9,如下图,看到了png格式的标志IH ...