混合库类型时遇到麻烦(静态与动态)

时间:2013-04-26 20:51:45

标签: c++ gcc boost shared-libraries boost-python

在与我的makefile混乱之后,我现在遇到了两个库应该如何交互的问题。所以,这是在Linux(CentOS 6.2 - 6.4,而不是在工具方面似乎有很大不同)。总体而言,该项目将以两种方式部署

  • 用于与其他C ++应用程序(a * .a文件)链接的C ++静态库
  • 使用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 include目录。

我在这里找到了类似问题的其他链接并尝试了解决方案但到目前为止无济于事。例如,this link使用-Wl,--whole-archive ... -Wl,--no-whole-archive。当我在使用-fPIC编译它之前尝试链接静态库存档时,我尝试了这个解决方案。既然我正在这样做,我已经尝试了this solution但也无济于事。在每种情况下,每次加载python并导入模块时,都会出现某种未定义的符号错误 - &gt;链接期间出了问题。

我应该如何将这些库混合在一起以使python模块工作?

1 个答案:

答案 0 :(得分:0)

加入gcc-help邮件列表后,我收到了解决问题所需的指针。问题结果是用于在构建命令行上进行链接的库的顺序。基本上,需要首先放置在构建* .so期间生成的目标文件。然后,对boost和其他库的引用。在其他库是关键之前,重新排序目标文件以引用为包装静态库而构建的对象。在加载我的python模块时,我不再看到奇怪的“未解析的对象”。

使用Visual Studio 4到5年后,我的gcc知识变得非常生疏,以至于在链接时我忘记了订购的重要性。