[英]CMake is not propagating link dependencies of shared libraries to my executable
我过去曾问过这个问题但是在不同的背景下。 我有一个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中用SHARED
替换STATIC
)我没有链接器错误! 有人告诉我,我必须自己将所有共享库链接到App
。 我试过了,它确实有效。 但现在我的问题是:
target_link_libraries
函数中PUBLIC
关键字的用途吗? LibA
是共享库时,为什么我没有链接器错误? EDIT1:
如果这有帮助:如果我做nm libA
我得到:
libA.cpp.o:
// ... blah blah ...
U mpfit
// ... blah blah ...
当将libB
链接到libA
时,链接器很可能丢弃未引用的符号。 这意味着当您链接到App
,会丢失一些 libB
符号。
在这种情况下,您可能希望指定链接器选项以在第一次链接期间保留整个libB
。 例如,对于gcc,你有--whole-archive ld参数
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.