[英]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.