我过去曾问过这个问题,但是在不同的背景下。我有一个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"
。 mpfit
是libB
中的一项功能。现在这是奇怪的事情:
LibA
共享(通过在CMake中用STATIC
替换SHARED
),我没有收到链接器错误!有人告诉我,我必须自己将所有共享库链接到App
。我试过了,它确实有效。但现在我的问题是:
PUBLIC
函数中target_link_libraries
关键字的用途吗?LibA
是共享库时,为什么我没有链接器错误?EDIT1:
如果这有帮助:如果我做nm libA
我得到:
libA.cpp.o:
// ... blah blah ...
U mpfit
// ... blah blah ...
答案 0 :(得分:1)
在将libB
链接到libA
时,链接器很可能会丢弃未引用的符号。这意味着,当您链接到App
时, libB
的某些符号将丢失。
在这种情况下,您可能希望指定链接器选项以在第一次链接期间保留整个libB
。例如,对于gcc,您有--whole-archive ld parameter