【发布时间】:2013-04-26 20:51:44
【问题描述】:
在与我的 makefile 问题作斗争之后,我现在遇到了两个库应该如何交互的问题。所以,这是在 Linux 上(CentOS 6.2 - 6.4,并不是说这在工具方面似乎有很大的不同)。总体而言,该项目将以两种方式部署
- 一个 C++ 静态库,用于链接其他 C++ 应用程序(*.a 文件)
- 使用 Boost.python 通过 python 部署的共享 *.so
我已经编译了所有内容,但我没有以某种方式正确链接。以静态库为例,有两种构建方式:
- 如果要与其他 C++ 代码链接,
-fPIC不使用 - 如果要链接到 python 模块,使用
-fPIC
我通过将参数传递给 make 程序来控制它。目前,我正在尝试构建 boost python 模块,因为静态的东西编译得很好。所以,我依赖于 boost 库和 zlib。最终的链接命令如下所示:
g++ -o pythonmod.so -L/boost/boost_libs -L/zlibs -lz -lboost_python -lboost_thread -lboost_regex -lboost_system /path/to/static.a -fPIC -shared [many_objects]
“many_objects”来自各种包装器和其他代码,它们在代码中包装了来自 boost.python 层的“纯”C++。这些目标文件中的每一个也都使用 -fPIC 进行编译。他们的编译:
g++ -I/boost/boost_1_47 -I/usr/include/python2.6 -D _linux -MMD -std=c++0x -c -m32 -fPIC <input> -o <output>
为归档文件编译目标文件的行看起来与上面非常相似,只是它们不包含 python 包含目录。
我在这里找到了类似问题的其他链接,并尝试了解决方案,但到目前为止无济于事。例如,this link 使用 -Wl,--whole-archive ... -Wl,--no-whole-archive。当我在使用 -fPIC 编译静态库存档之前尝试链接静态库存档时,我尝试了此解决方案。现在我这样做了,我尝试了this solution,但也无济于事。在每种情况下,每次我加载 python 并导入模块时,我都会遇到某种未定义的符号错误 --> 链接过程中出了点问题。
我应该如何将这些库混合在一起以使 python 模块工作?
【问题讨论】:
标签: c++ gcc boost shared-libraries boost-python