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

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

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

1.库的加载

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

  1. #ifdef WIN32
  2. #pragma comment(lib, "osip2.lib")
  3. #pragma comment(lib, "osipparser2.lib")
  4. #pragma comment(lib, "eXosip.lib")
  5. #pragma comment(lib, "InterProtocol.lib")
  6. #pragma comment(lib, "tinyxml.lib")
  7. #else
  1. linux中不行,需要直接编译的时候链接动态库
    所以改写如下
  1. gcc -gbserver data.c -leXosip2 -ljrtp -ljthread -losip2 -losipparser2 -ltinyxml

2.头文件的路径问题

  windows支持两种方式

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

都支持

而Linux只支持

  1. #include "eXosip2/eXosip.h"

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

  1. gcc -std=gnu++11 -ggdb3
  2. Instance.cpp jyzbyj.lnp.GbClientSdk.cpp Session.cpp Sip.cpp
  3. -fPIC -shared -o libgbclientsdk.so -L /usr/local/lib
  4. -I /home/jyzbyj/mjl/jyzbyj.lnp.GbClientSdk -I /usr/include
  5. -leXosip2 -ljrtp -ljthread -losip2 -losipparser2 -ltinyxml
  6. -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

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

保证你编译.o文件的时候,都加上-fPIC,这样你才能编译出动态库来。

错误:

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

解决:

  1. -I /usr/include/c++/4.6/x86_64-linux-gnu (无效)

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

添加

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

一般 CFLAGS=-m64(64位) CFLAGS=-m32(32位)

错误

  1. nullptr was not declared in this scope

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

  1. CFLAGS=-m64 -fpic -std=gnu++0x (解决)

问题

  1. error: string in namespace std does not name a type
  2. std::string AlgoName;

很明显,缺少一个

  1. #include<string> (解决)

问题

  1. error: strcpy_s was not declared in this scope

‘strcpy_s’改strncpy 正常

问题

  1. goto _ERR_
  2. error: jump to label _ERR_ [-fpermissive]
  3. _ERR_:

定义成宏(解决)

问题

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

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

问题

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

Makefile如下,因为interprocess库不依赖库,所以头文件只需要包含boost顶层目录即可,仅依赖系统库编辑时需要指定-lrt.

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

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

问题

  1. /ffmpeg-3.2.2/include/libavcodec/avcodec.h:34:30: fatal error: libavutil/buffer.h: 没有那个文件或目录
  2. #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

重复多次引用 删除多余的引用,解决

问题

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

-lpthread -lboost_thread 解决

问题

  1. /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o:在函数‘_start’中:
  2. (.text+0x20):对‘main’未定义的引用

添加编译文件XXX.cpp ,正常,XXX.cpp包含main()

问题

  1. logger-cs.o:在函数‘Logger::init(int, std::string, Logger::LogLevel, Logger::LogLevel)’中:
  2. 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)’未定义的引用
  3. logger-cs.cpp:112:对‘boost::log::v2s_mt_posix::core::get()’未定义的引用
  4. 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&)’未定义的引用
  5. logger-cs.o:在函数‘boost::log::v2s_mt_posix::attribute_name::attribute_name(char const*)’中:
  6. /usr/include/boost/log/attributes/attribute_name.hpp:80:对‘boost::log::v2s_mt_posix::attribute_name::get_id_from_string(char const*)’未定义的引用
  7. logger-cs.o:在函数‘boost::log::v2s_mt_posix::aux::attribute_set_reference_proxy::operator=(boost::log::v2s_mt_posix::attribute const&) const’中:
  8. /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&)’未定义的引用
  9. logger-cs.o:在函数‘boost::log::v2s_mt_posix::record::reset()’中:
  10. /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*)’未定义的引用
  11. logger-cs.o:在函数‘boost::log::v2s_mt_posix::aux::once_block_sentry::~once_block_sentry()’中:
  12. /usr/include/boost/log/utility/once_block.hpp:85:对‘boost::log::v2s_mt_posix::aux::once_block_sentry::rollback()’未定义的引用
  13. logger-cs.o:在函数‘boost::log::v2s_mt_posix::aux::once_block_sentry::executed() const’中:
  14. /usr/include/boost/log/utility/once_block.hpp:90:对‘boost::log::v2s_mt_posix::aux::once_block_sentry::enter_once_block() const’未定义的引用
  15. logger-cs.o:在函数‘boost::log::v2s_mt_posix::expressions::tag::message::get_name()’中:
  16. /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

  1. # if defined(BOOST_LOG_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)
  2. # define BOOST_LOG_DLL
  3. # endif
  4.  
  5. # if defined(BOOST_LOG_DLL)
  6. # if defined(BOOST_SYMBOL_IMPORT)
  7. # define BOOST_LOG_API BOOST_SYMBOL_IMPORT
  8. # elif defined(BOOST_HAS_DECLSPEC)
  9. # define BOOST_LOG_API __declspec(dllimport)
  10. # endif
  11. # endif
  12. # ifndef BOOST_LOG_API
  13. # define BOOST_LOG_API
  14. # endif

还是依然报错

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

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

问题

  1. :80:对‘avcodec_parameters_to_context’未定义的引用
  2. :85:对‘avcodec_free_context’未定义的引用
  3. :102:对‘av_frame_alloc’未定义的引用
  4. ffmpeg_stream_chr.o:在函数‘FfmpegStreamChr::DecodeToImage()’中:
  5. :305:对‘av_packet_unref’未定义的引用
  6. :311:对‘avcodec_send_packet’未定义的引用
  7. :313:对‘avcodec_receive_frame’未定义的引用
  8. :322:对‘av_packet_unref’未定义的引用
  9. :334:对‘av_packet_unref’未定义的引用
  10. :336:对‘av_frame_unref’未定义的引用
  11. :351:对‘av_packet_unref’未定义的引用
  12. :352:对‘av_frame_unref’未定义的引用
  13. :360:对‘av_packet_unref’未定义的引用
  14. ffmpeg_stream_chr.o:在函数‘FfmpegStreamChr::Close()’中:
  15. :414:对‘av_frame_free’未定义的引用
  16. :419:对‘avcodec_free_context’未定义的引用
  1. 链接库错误 -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
  2.  
  3. 问题
  1. /usr/local/lib/libliveMedia.so:对‘AddressString::AddressString(in_addr const&)’未定义的引用
  2. /usr/local/lib/libliveMedia.so:对‘NetAddressList::NetAddressList(char const*)’未定义的引用
  3. /usr/local/lib/libliveMedia.so:对‘makeSocketNonBlocking(int)’未定义的引用
  4. /usr/local/lib/libliveMedia.so:对‘Groupsock::Groupsock(UsageEnvironment&, in_addr const&, Port, unsigned char)’未定义的引用
  5. /usr/local/lib/libliveMedia.so:对‘AddressString::~AddressString()’未定义的引用
  6. /usr/local/lib/libliveMedia.so:对‘IsMulticastAddress(unsigned int)’未定义的引用
  7. /usr/local/lib/libliveMedia.so:对‘Groupsock::wasLoopedBackFromUs(UsageEnvironment&, sockaddr_in&)’未定义的引用
  8. /usr/local/lib/libliveMedia.so:对‘AddressPortLookupTable::Add(unsigned int, unsigned int, Port, void*)’未定义的引用
  9. /usr/local/lib/libliveMedia.so:对‘AddressPortLookupTable::AddressPortLookupTable()’未定义的引用
  10. /usr/local/lib/libliveMedia.so:对‘Groupsock::multicastSendOnly()’未定义的引用
  11. /usr/local/lib/libliveMedia.so:对‘increaseReceiveBufferTo(UsageEnvironment&, int, unsigned int)’未定义的引用
  12. /usr/local/lib/libliveMedia.so:对‘makeSocketBlocking(int, unsigned int)’未定义的引用
  13. /usr/local/lib/libliveMedia.so:对‘NoReuse::~NoReuse()’未定义的引用
  14. /usr/local/lib/libliveMedia.so:对‘AddressPortLookupTable::Iterator::next()’未定义的引用
  15. /usr/local/lib/libliveMedia.so:对‘Groupsock::changeDestinationParameters(in_addr const&, Port, int, unsigned int)’未定义的引用
  16. /usr/local/lib/libliveMedia.so:对‘AddressPortLookupTable::Iterator::Iterator(AddressPortLookupTable&)’未定义的引用
  17. /usr/local/lib/libliveMedia.so:对‘our_inet_addr’未定义的引用
  18. /usr/local/lib/libliveMedia.so:对‘Groupsock::Groupsock(UsageEnvironment&, in_addr const&, in_addr const&, Port)’未定义的引用
  19. /usr/local/lib/libliveMedia.so:对‘NetAddress::operator=(NetAddress const&)’未定义的引用
  20. /usr/local/lib/libliveMedia.so:对‘AddressPortLookupTable::Lookup(unsigned int, unsigned int, Port)’未定义的引用
  21. /usr/local/lib/libliveMedia.so:对‘NetAddress::NetAddress(unsigned int)’未定义的引用
  22. /usr/local/lib/libliveMedia.so:对‘NetAddress::~NetAddress()’未定义的引用
  23. /usr/local/lib/libliveMedia.so:对‘NetAddressList::~NetAddressList()’未定义的引用
  24. /usr/local/lib/libliveMedia.so:对‘SendingInterfaceAddr’未定义的引用
  25. /usr/local/lib/libliveMedia.so:对‘AddressPortLookupTable::Remove(unsigned int, unsigned int, Port)’未定义的引用
  26. /usr/local/lib/libliveMedia.so:对‘NetAddressList::firstAddress() const’未定义的引用
  27. /usr/local/lib/libliveMedia.so:对‘AddressString::AddressString(sockaddr_in const&)’未定义的引用
  28. /usr/local/lib/libliveMedia.so:对‘ignoreSigPipeOnSocket(int)’未定义的引用
  29. /usr/local/lib/libliveMedia.so:对‘setupStreamSocket(UsageEnvironment&, Port, unsigned char)’未定义的引用
  30. /usr/local/lib/libliveMedia.so:对‘ReceivingInterfaceAddr’未定义的引用
  31. /usr/local/lib/libliveMedia.so:对‘getSourcePort(UsageEnvironment&, int, Port&)’未定义的引用
  32. /usr/local/lib/libliveMedia.so:对‘AddressString::AddressString(unsigned int)’未定义的引用
  33. /usr/local/lib/libliveMedia.so:对‘readSocket(UsageEnvironment&, int, unsigned char*, unsigned int, sockaddr_in&)’未定义的引用
  34. /usr/local/lib/libliveMedia.so:对‘Groupsock::removeAllDestinations()’未定义的引用
  35. /usr/local/lib/libliveMedia.so:对‘increaseSendBufferTo(UsageEnvironment&, int, unsigned int)’未定义的引用
  36. /usr/local/lib/libliveMedia.so:对‘our_random32’未定义的引用
  37. /usr/local/lib/libliveMedia.so:对‘Socket::reset()’未定义的引用
  38. /usr/local/lib/libliveMedia.so:对‘AddressPortLookupTable::Iterator::~Iterator()’未定义的引用
  39. /usr/local/lib/libliveMedia.so:对‘ourIPAddress(UsageEnvironment&)’未定义的引用
  40. /usr/local/lib/libliveMedia.so:对‘our_random’未定义的引用
  41. /usr/local/lib/libliveMedia.so:对‘Port::Port(unsigned short)’未定义的引用
  42. /usr/local/lib/libliveMedia.so:对‘NoReuse::NoReuse(UsageEnvironment&)’未定义的引用
  1. 网上说是链接顺序的问题 变换顺序为-lliveMedia -lBasicUsageEnvironment -lgroupsock -lUsageEnvironment 正常

问题

makefile编译时候出现:commands commence before first target

解决

我们知道, 在C/C++语言中, 可以用\来换行, 此时要注意, 在一行的最后面加上\,  而这个\后面不能再有任何字符, 哪怕是空格, 也不允许, 否则出错。

对于makefile, 也有类似的原则, 最近写makefile,  一不小心, 在\后多了个空格, 结果编译出现:commands commence before first target

dlopen err:plugins/libvap2.image_capturer.gb.gpu.so: undefined symbol: logger.

一般是哪个类没申明,尤其是extern,需要一个正常声明的地方

如果觉得还可以,打赏地址

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. NanUI文档 - 开始使用NanUI

    NanUI文档目录 NanUI简介 开始使用NanUI 打包并使用内嵌式的HTML/CSS/JS资源 使用网页来设计整个窗口 如何实现C#与Javascript相互掉用(待更新...) 如何处理Nan ...

  2. idea 导入项目后 有的项目目录结构不展开解决办法

    如图:可能会出现这中国情况. 解决办法: 1.一般项目导入完成后,但是目录不展开, 2.出现这种情况一般情况下, 关闭idea close idea ,然后重新导入一遍就OK.

  3. 2017年国内常用的公共NTP服务

    安卓机顶盒里常用的 http://cn.pool.ntp.org CERNET 的一堆服务器就在那里面 http://asia.pool.ntp.org 追踪它的IP,台湾.韩国.日本都有. 阿里云 ...

  4. iKcamp出品微信小程序教学共5章16小节汇总(含视频)

  5. IOS学习2——Xcode快捷键大全

    转载自:图文解释XCode常用快捷键的使用 刚开始用Xcode是不是发现以前熟悉的开发环境的快捷键都不能用了?怎么快捷运行,停止,编辑等等.都不一样了.快速的掌握这些快捷键,能提供开发的效率. 其实快 ...

  6. iOS Block的简单使用以及__block 和static修饰变量

    简单的代码总结,不足之处多多指教. //简单的使用 -(void)blockOne{ ; int(^BlockOne)(int) = ^(int num2) { return number*num2; ...

  7. mouseout、mouseover和mouseleave、mouseenter区别

    今天在使用鼠标事件时,用错了mouseout,于是做个测试总结. 结论: mouseenter:当鼠标移入某元素时触发. mouseleave:当鼠标移出某元素时触发. mouseover:当鼠标移入 ...

  8. Jenkins 关闭和重启实现方式.

    1.关闭Jenkins 只需要在访问jenkins服务器的网址url地址后加上exit.例如我jenkins的地址http://localhost:8080/,那么我只需要在浏览器地址栏上敲下http ...

  9. http性能测试工具wrk源码学习之开篇

    1.前言 最近工作需要测试nginx反向代理的性能,于是找了一些http测试工具,例如经典的Apache的ab.siege.wrk.wrk使用多线程事件驱动方式,支持lua脚本扩展.关于wrk介绍可以 ...

  10. 1.sass的安装,编译,还有风格

    1.安装sass 1.安装ruby 因为sass是用ruby语言写的,所以需要安装ruby环境 打开安装包去安装ruby,记住要勾选 下面选项来配置环境路径 [x] Add Ruby executab ...