【问题标题】:CMake: Shared library that uses static libraryCMake:使用静态库的共享库
【发布时间】:2010-11-18 22:20:28
【问题描述】:

我正在尝试创建一个链接到静态库的共享库(实际上是一个 Python 模块)。这两个库是同一个项目的一部分,并且使用 cmake 构建。

现在,共享库是这样构建的:


add_library(MyLibPython SHARED ${PYTHON_WRAPPERS_SRC})
set_target_properties(MyLibPython PROPERTIES PREFIX "")
target_link_libraries(MyLibPython MyLibStatic ${LIBS})

这构建没有错误,但是当我尝试导入 Python 模块时,我得到:

导入错误: lib/python/MyLibPython.so:未定义符号:_Zone_of_my_MyLibStatic_functions

我还有许多以类似方式构建的可执行文件(单元测​​试),它们运行良好。

我应该补充一下,这是在 Linux 上使用 gcc。

【问题讨论】:

  • 您是否尝试静态链接到 Boost::Python?或者您是否静态链接到包装库?如果是前者:请在此处查看我的答案:stackoverflow.com/questions/4120169/…
  • 是后者。但是感谢您的链接,有趣的是,静态链接到 boost python 并不总是有效...

标签: c++ linux gcc cmake boost-python


【解决方案1】:

检查您的链接器命令行。它是否传递了-Wl,--as-needed 之类的东西?如果是这样,它可能没有包含静态库所需的所有内容。

我不认为您的技术总体上是可移植的。你能得到一个共享库来链接吗?我认为在某些平台上,进入共享库的所有内容都需要编译为 PIC。

无论如何,用 GNU ld 链接整个存档(查找 man ld):

gcc -o foo foo.o bar.o baz.o -Wl,--whole-archive libfoo.a -Wl,--no-whole-archive [rest-of-linker-args]

【讨论】:

  • 很遗憾,我没有碎片库。我可能可以直接链接目标文件,但这需要大量重写构建脚本,我希望避免这种情况。
  • 链接整个档案工作。问题似乎是在链接 .so 文件时,即使静态库中的代码引用它,静态库也不包括在内。似乎 ld 假定可执行文件(在本例中为 python)将链接到与 .so 相同的静态库。
  • @Krumelur:如果这是问题所在,您可能会通过gcc ... -Wl,-Bstatic -lfoo -Wl,-Bdynamic ... 链接获得一些运气
  • 谢谢!会尝试,一旦我弄清楚如何将其放入 cmake :)
猜你喜欢
  • 2015-10-08
  • 1970-01-01
  • 2013-10-09
  • 2023-03-03
  • 2018-03-18
  • 2021-11-21
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多