在与我的 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 并导入模块时,都会出现某种 undefined symbol 错误 --> 链接期间出现问题。
我应该如何将这些库混合在一起以使 python 模块工作?
最佳答案
加入 gcc-help 邮件列表后,我收到了解决问题所需的指示。问题出在构建命令行上用于链接的库的排序。基本上,在构建过程中为 *.so 生成的目标文件需要放在第一位。然后,对 boost 和其他库的引用。重新排序目标文件以引用为在其他库之前包装静态库而构建的对象是关键。加载我的 python 模块时,我不再看到奇怪的“未解析对象”。
在使用 Visual Studio 4 或 5 年后,我的 gcc 知识已经生疏到足以忘记在链接时排序的重要性。
关于c++ - 混合库类型(静态与动态)有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16245034/