CMake没有将共享库的链接依赖性传播到我的可执行文件

时间:2016-06-23 14:26:07

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

我过去曾问过这个问题,但是在不同的背景下。我有一个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应该自动将所有链接依赖项传播到我的可执行文件?这不是PUBLIC函数中target_link_libraries关键字的用途吗?
  • LibA是共享库时,为什么我没有链接器错误?

EDIT1:

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

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

1 个答案:

答案 0 :(得分:1)

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

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