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