【问题标题】:Linking a dynamic library to a static library that links to other static libraries将动态库链接到链接到其他静态库的静态库
【发布时间】:2012-05-03 13:59:12
【问题描述】:

在我的 C++ 应用程序中,我有一个静态库 (libCOMMON.a),它链接到 boost 库:system、filsystem、timer 和 chrono。

我正在使用 CMake,这是我创建和链接 libCOMMON.a 的方式:

ADD_LIBRARY(COMMON ${COMMON_SRCS})
target_link_libraries(COMMON 
    ${BOOST_LIB_DIR}/libboost_filesystem.a
    ${BOOST_LIB_DIR}/libboost_system.a
    ${BOOST_LIB_DIR}/libboost_timer.a
    ${BOOST_LIB_DIR}/libboost_chrono.a
)

我还有链接到 libCOMMON.a 的此应用程序的插件。插件被构建为动态库。一切编译正常(使用 gcc),但是当我启动应用程序时,无法加载插件,因为无法解析与 boost 相关的动态库中的某些符号。

解决方案是将每个插件链接到 boost。有没有更好的办法 ? 我认为如果boost库静态链接到libCOMMON.a,将插件链接到libCOMMON.a就足够了。

有人可以解释发生了什么吗?

谢谢

【问题讨论】:

  • 你能显示用于生成 libCOMMON.a 的命令吗?有几种方法可以解决这个问题。
  • 我正在使用 CMake 来做到这一点:ADD_LIBRARY(COMMON ${COMMON_SRCS})。我已经编辑了问题并添加了更多详细信息。
  • 静态库不能“链接到”其他静态库。静态库只是目标文件的集合。没有适当的机制来引用其他库。您可以从几个较小的库中创建一个大库,但这在重复信息方面是毫无意义的。
  • 好吧,我的插件不需要知道 boost。他们使用了一些 boost 的功能和/或其他库,这些库组装在 libCOMMON 中可用的一些接口对象(请参阅外观设计模式)中。

标签: c++ gcc static-linking dynamic-linking


【解决方案1】:

我认为问题在于默认情况下,boost 库是作为动态库构建的。即使“.a”表明它们是作为静态库构建的,boost 的 lib 文件夹也包含一个“.so”库,每个“.a”。这意味着 libCOMMON.a 动态链接到 boost 库。出于这个原因,静态链接到 libCOMMON.a 的插件也必须动态链接到 boost 库。更好的解决方案是将 boost 库构建为静态库。

【讨论】:

    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多