使用 cmake 語言,假設我創建了一個目標foo,并將其鏈接到libbar.so. libbar.so已經在具有 cmake PRIVATE 依賴關系的不同平臺上編譯libbaz.so。所以依賴鏈是
foo ----> libbar --(PRIVATE)--> libbaz
當我編譯并鏈接它時,是否libbaz.so需要出現在系統上?我的理解是我可以不用. 換句話說,我的直覺是這只是一個運行時,而不是編譯時依賴。foolibbarfoolibbazlibbazfooLD_LIBRARY_PATHlibbaz
但是我目前對大型構建系統的設計取決于這種預感是否正確,所以我想仔細檢查一下。
uj5u.com熱心網友回復:
編譯器工具鏈的一般鏈接
一般來說,這取決于如何libbaz鏈接到libbar.
如果libbaz在構建時靜態鏈接,libbar則在構建時沒有編譯或運行時依賴項footo libbaz。這是因為靜態鏈接的代碼被“復制”到鏈接它的檔案中(當沒有使用特殊的黑客或其他黑魔法時)。
如果libbaz在構建時動態鏈接,libbar則libbaz(僅)是構建時的運行時依賴項foo。
| 最終圖書館 | 鏈接 | 中間圖書館 | 鏈接 | 第一個圖書館 | 運行時依賴 |
|---|---|---|---|---|---|
| 富 | 靜態的 | 庫吧 | 靜態的 | 自由行 | 沒有任何 |
| 富 | 靜態的 | 庫吧 | 動態的 | 自由行 | 自由行 |
| 富 | 動態的 | 庫吧 | 靜態的 | 自由行 | 庫吧 |
| 富 | 動態的 | 庫吧 | 動態的 | 自由行 | 庫吧,庫巴茲 |
有一個例外。但它不應該適用于您指定的場景。如果通過 Windows-API LoadLibrary或 Unix/Linux/...-API dlopenlibbar動態加載另一個庫(如),則聯結器在構建時沒有關于此依賴項的任何資訊。在這種情況下,它是代碼的動態運行時依賴項。libbaz
公共/私人
在這種情況下,當您使用 CMake 時,它??是 CMake 的一個術語。這僅在 CMake 中定義依賴項時才有意義(主要通過target_link_libraries)。
| CMake 目標 | 鏈接 | CMake 目標或庫 | 描述 |
|---|---|---|---|
| 庫吧 | 私人的 | 自由行 | libbar在編譯時獲取libbaz 的包含等,并在鏈接時作為鏈接庫。 |
| 庫吧 | 上市 | 自由行 | libbar在編譯時獲取libbaz 的包含等,并在鏈接時作為鏈接庫。 使用libbar的庫也獲得了libbaz的介面部分(介面包括、庫等)。 |
| 庫吧 | 界面 | 自由行 | libbar根本不使用libbaz。 使用libbar的庫正在獲取libbaz的介面部分(介面包括、庫等)。 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/529041.html
標籤:C linux制作
上一篇:為什么`x86-64`和`x32`的系統呼叫號不同但相似,為什么有些沒有在unistd_x32.h中定義?
下一篇:如何使彈出視頻回應于移動設備
