1

在与我的 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 模块工作?

4

1 回答 1

0

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

在使用 Visual Studio 4 或 5 年后,我的 gcc 知识已经生疏,以至于我忘记了在链接方面排序的重要性。

于 2013-04-29T18:56:30.883 回答