标签:
今天在编译python so时出现点问题——把其他C库链接到同一个so里——尝试了一早上发现了方法,已经更新到本系列的第二节里了。
整理了一下工程目录,打算用scons管理。
scons毕竟是一种新型的build工具,比makefile肯定有很大进步,至少更清晰好学,少了很多晕晕的trick。但是相比其他高级工具比如cmake之类的,就不清楚优劣了。
这个例子写的过于简单了,正常使用时多用env,可以统一参数,简化编写。
例子:
obj = Object( "test.c", CPPPATH=["xxx"], CFLAGS=["-g"] ) obj2 = Object( "main.cc", CPPPATH=["xxx"], CFLAGS=["-g", "-std=c++11"] ) Program("out_exe", [obj, obj2], LIBS=["dl"], LINKFLAGS=["-pthread"] )
注意这个例子里混用了c源码和cpp源码,scons会分别使用gcc和g++进行处理。
值得一说的是纯C语言的代码部分,需要用以下代码完全包裹起来。
#ifdef __cplusplus
extern "C" {
#endif
// c code
#ifdef __cplusplus
}
#endif
用C和CPP混合编写的原因是:用dlfcn库操作so时,显然C语言会更方便,C语言的 void* 类型,具有一定的动态语言的特性,非常好用,转换时也基本不会报 warning。同样的代码用 g++ 很难编译过去,要改写法。
Python的源码也是用C写的,用C调用相对容易。
但是又打算网络库采用RakNet,RakNet是个大量使用cpp特性编写的库。
所以难免C和CPP都要用,操作python和so的代码用C风格,大部分底层逻辑和网络部分要用C++。
版权声明:本文为博主原创文章,未经博主允许不得转载。
Meme游戏服务器开发日记(四)scons编译工具、C和C++混合使用
标签:
原文地址:http://blog.csdn.net/mayao11/article/details/48009863