簡體   English   中英

CMake沒有將共享庫的鏈接依賴性傳播到我的可執行文件

[英]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 我試過了,它確實有效。 但現在我的問題是:

  • 是不是CMake應該自動將所有鏈接依賴項傳播到我的可執行文件? 這不是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM