【问题标题】:Having troubles with mixing library types (static vs. dynamic)混合库类型(静态与动态)时遇到问题
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      相关资源
      最近更新 更多