我將一個AutoTools項目移植到CMake。CMake將共享庫鏈接到靜態庫
自動工具的作用:
- 建立一些靜態庫
- 建立一些共享庫和靜態的鏈接到共享
- 建立一個可執行文件,它鏈接到共享庫
什麼我設法做CMake:
- 建立一些靜態庫 -
add_library(staticfoo <src>)
- 建一些共享庫 -
add_library(sharedfoo SHARED <src>)
並將其鏈接 -target_link_libraries(sharedfoo staticfoo)
- 建立一個可執行文件,它鏈接到共享庫 -
target_link_libraries(exe sharedfoo)
,但拖累再次靜態庫了。
因此,除了共享之外,可執行文件的結果鏈接命令還具有靜態庫。這與AutoTools項目生成的命令不符。
我試過target_link_libraries(sharedfoo PRIVATE staticfoo)
,但是沒有從靜態庫中獲取符號到共享庫的接口中。
如何獲得沒有「傳遞」行爲的符號?
(以平臺無關的方式)
CMake不關心你試圖鏈接靜態/動態/混合的類型的庫......這將成爲特定平臺鏈接器的問題。 – zaufi
在窗口上,鏈接器通過鏈接已保存的對象/靜態庫來丟棄導出符號,但解壓縮的對象可以工作。這是爲什麼將對象庫添加到cmake中的主要原因之一。 – Youka
事實上,這是轉換自動工具項目中找到的模式的好方法。對於替代品和他們的問題,看到這個詳細的問題:http://stackoverflow.com/questions/5136184/linking-windows-dll-files-from-static-libraries-using-cmake-without-hand-craftin –