【问题标题】:CMake is not propagating link dependencies of shared libraries to my executableCMake 没有将共享库的链接依赖项传播到我的可执行文件
【发布时间】:2016-06-23 14:26:07
【问题描述】:

我过去曾问过这个问题,但在不同的背景下。我有一个 C++ 应用程序 (App),它链接到静态 C++ 库 A (libA),它链接到静态 C 库 B (libB):

# App CMakeLists.txt
add_executable(App ${APP_HEADER_FILES} ${APP_SOURCE_FILES})
target_link_libraries(App PUBLIC LibA)

# LibA CMakeLists.txt
add_library(LibA STATIC ${LIBA_HEADER_FILES} ${LIBA_SOURCE_FILES})
target_link_libraries(LibA PUBLIC LibB)

问题是,当我构建App 时,我得到一个链接器错误:"error: undefined reference to mpfit"mpfitlibB 中的一个函数。现在奇怪的是:

  • 如果我将 LibA 共享(通过在 CMake 中将 STATIC 替换为 SHARED)我不会收到链接器错误!

有人告诉我,我必须自己将所有共享库链接到App。我试过了,它确实有效。但这是我现在的问题:

  • CMake 不应该自动将所有链接依赖项传播到我的可执行文件吗?这不就是target_link_libraries函数中PUBLIC关键字的用途吗?
  • LibA 是共享库时,为什么我没有收到链接器错误?

编辑1:

如果有帮助:如果我这样做 nm libA 我会得到:

libA.cpp.o:
    // ... blah blah ...
    U mpfit
    // ... blah blah ...

【问题讨论】:

  • 你有来自libBlibA使用的error: undefined reference to符号
  • @UmNyobe 是的,完全正确
  • 如果我们在谈论例如GNU 工具链,您可以使用 verbose output 查看实际调用的内容(例如,在 Windows 平台上,其中有 weird workarounds)。一般来说,STATICSHARED 之间的区别在于,SHARED LibA 确实有 LibB 链接到它。
  • CMake link not subfolder的可能重复

标签: c++ cmake static-libraries linker-errors static-members


【解决方案1】:

链接器很可能在将libB 链接到libA 时删除了未引用的符号。这意味着当您链接到App 时,libB一些 符号已丢失。

在这种情况下,您可能需要指定链接器选项以在第一次链接期间保留整个 libB。例如,对于 gcc,您有 --whole-archive ld parameter

【讨论】:

    猜你喜欢
    • 2013-05-11
    • 2021-06-16
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    相关资源
    最近更新 更多