将动态库链接到链接到其他静态库的静态库

时间:2012-05-03 13:59:12

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

在我的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就足够了。

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

由于

1 个答案:

答案 0 :(得分:0)

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