|
这段时间得到一份源码,是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++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 |
|
|