簡體   English   中英

使用 CMake 創建 C++ 庫

[英]Creating C++ library with CMake

我正在嘗試創建一個合理的庫結構和 CMake 文件,這將允許其他 CMake 項目輕松包含此庫。 我發現了很多類似的問題,但是,它們似乎都沒有解決我的確切問題。

我目前的結構如下:

/*MyLibrary/
├── CMakeLists.txt (including lib subdirectories)
├── external/
│   └── googletest/
├── lib/
│   ├── common/
│   │   ├── CMakeList.txt (creates static lib common)
│   │   ├── include/common/*.h
│   │   └── src/*.cpp
│   ├── cipher/
│   │   ├── CMakeList.txt (creates static lib cipher)
│   │   ├── include/cipher/*.h
│   │   └── src/*.cpp
└── test/
    ├── main.cpp (code for executing google test)
    ├── CMakeLists.txt (creates unittest executable)
    ├── common/*Test.cpp
    └── cipher/*Test.cpp
*/

現在我想創建一個具有類似目錄結構的項目,但是當我想在該項目中創建一個與MyLibrary中的靜態庫之一同名的靜態庫時出現問題(例如, common )。

我正在考慮在項目add_subdirectory(external/MyLibrary)使用add_subdirectory(external/MyLibrary)將庫包含到項目中,但由於靜態庫的名稱沖突而失敗。

即使我通過重命名庫來解決這個問題(我實際上並不認為這是一個優雅的解決方案),我最終還是會遇到 googletest 沖突,因為庫和我的項目都依賴於 googletest。

有什么辦法可以輕松解決這個問題嗎? 我在想兩種可能性:

  • MyLibrary我將從名為libMyLibrary.a所有子庫中創建一個靜態庫,並僅包含該庫(首選選項,但我不知道如何在 CMake 中實現它)

  • 強制庫的用戶安裝它並且不將該庫作為項目子模塊包含(我會選擇的最后一個選項)

有沒有其他合理的方法來解決它,使我的庫與大多數 CMake 項目兼容? 如果沒有,我怎樣才能至少實現上述選項之一?

簡而言之:如何為庫創建 CMake 文件,以便該庫易於包含在其他 CMake 項目中?

如何處理 googletest 等冗余依賴項?

如何為庫創建 CMake 文件,以便該庫易於包含在其他 CMake 項目中?

為此沒有通用的方法。

通過使用add_subdirectory()將您的項目包含到另一個項目中,您可以將項目的內部結構“開放”給另一個項目。 除了讓庫的目標准備好鏈接之外,這種方法也有缺點。 Target 的碰撞、緩存變量碰撞將是您頭疼的問題,還有一些其他問題。

如果您希望您的項目通過add_subdirectory包含到 other 中,請避免為您的目標使用“通用”名稱。 例如,使用<my_project_name>_common而不是common

某些無法重命名的目標(例如gtest )。 如果您的項目實際上不需要這些目標,請創建一個禁用它們的選項:

option(<my_project_name>_TESTING "Enable testing" ON)
if(<my_project_name>_TESTING)
    add_subdirectory(external/googletest)
endif()

另請參閱對有關目標名稱沖突的類似問題的回答

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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