c++ - 将动态库链接到链接到其他静态库的静态库

标签 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 就足够了。

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

谢谢

最佳答案

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

关于c++ - 将动态库链接到链接到其他静态库的静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10432968/

相关文章:

c++ - ifstream 和 ofstream : How do I perform multiple modifications to a file?

c++ - 在运行时修改模板函数的名称 - 可能吗?

c++ - 关于 -fPIC 的链接错误,即使所有源代码都是使用 -fPIC 编译的

docker - 如何在 CentOS 7 docker 上安装 gcc/g++ 9 (centos :7)

c++ - 编译错误 : No match for overloaded operator

c - 如何在编译时静态链接libevent和gcc?

c++ - calloc 覆盖另一个变量的内存?

c++ - 整数类型可以在 C++ 中存储的值范围是多少?

c++ - 无法将 tomsfastmath 链接到 libtomcrypt

c++ - 使用 ndk-build 链接现有的静态库