在与我的 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 包含目录。
我在这里找到了类似问题的其他链接并尝试了解决方案,但到目前为止无济于事。例如,此链接使用-Wl,--whole-archive ... -Wl,--no-whole-archive
. 当我在使用 -fPIC 编译静态库存档之前尝试链接静态库存档时,我尝试了此解决方案。现在我正在这样做,我已经尝试过这个解决方案,但也无济于事。在每种情况下,每次我加载 python 并导入模块时,都会出现某种未定义的符号错误——>链接过程中出现问题。
我应该如何将这些库混合在一起以使 python 模块工作?