Cmake不会将共享库的链接依赖关系传播到我的可执行文件

CMake is not propagating link dependencies of shared libraries to my executable

本文关键字:关系 依赖 传播 可执行文件 我的 链接 共享 Cmake      更新时间:2023-10-16

我过去曾问了这个问题,但在不同的情况下。我有一个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中的SHARED替换STATIC)我没有链接器错误!

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

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

edit1:

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

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

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

在这种情况下,您可能需要指定链接器选项,以在第一个链接期间保留整个libB。例如,对于GCC,您拥有 - 全仓LD参数