3
我想在CMake的創建自定義目標:cmake的:創建新庫的目標其中包括預建圖書館的
- 鏈接供應商提供的歸檔
- 增加
target_compile_options(... PUBLIC ...)
- 增加
target_include_directories(... PUBLIC ...)
通過這種方式,消費者可以鏈接到我的新目標,並具有必需的目錄和編譯選項集。
在boost-build中,您可以使用<file>
功能對預建庫進行「包裝」或「別名」,並添加額外的「使用要求」(編譯器標誌等),這些要求將被添加到使用該庫的所有目標中。
lib foo
:
: <file>vendor/library.a
:
: <include>vendor
;
- 這個別名
vendor/library.a
作爲一個新的圖書館foo
。 - 當另一個目標使用
foo
時,它也將更新其包含路徑。 - 然後使用
foo
的代碼將能夠#include "foo.h"
,並且該文件將被找到,因爲vendor
已被添加到包含路徑中。
我正在尋找一種方法來在CMake中做同樣的事情。
的方式我目前還它會沿着這些路線的東西:
find_library(LIB_FOO library.a PATHS ${CMAKE_SOURCE_DIR}/path/to/vendor NO_DEFAULT_PATH)
target_link_library (my_target ${LIB_FOO})
target_include_directories(my_target PRIVATE "${CMAKE_SOURCE_DIR}/path/to/vendor")
但是,如果有這需要使用foo
那麼這3個電話會被重複他們每個人的幾個目標,這變得相當麻煩。
這將是對消費者的foo
更容易有它有一些其他的目標
target_link_libraries (foo ${CMAKE_CURRENT_LIST_DIR}/vendor/library.a)
target_compile_options (foo PUBLIC ...)
target_include_directories(foo PUBLIC ...)
問:
- 我可以創建一個新庫的目標它由一個預建圖書館,這將允許我做我所描述的?響應
編輯評論:
我試圖創建一個IMPORTED
庫(如描述here):
add_library(foo STATIC IMPORTED)
set_property(TARGET foo PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/vendor/library.a)
然而,當我再試着設置包括目錄我出現錯誤:
target_include_directories(foo SYSTEM PUBLIC "${CMAKE_CURRENT_LIST_DIR}/vendor")
Err或:
CMake Error at vendor/CMakeLists.txt:39 (target_include_directories): Cannot specify include directories for imported target "foo".
我猜你需要導入預建的圖書館,像它這樣做[這裏](https://cmake.org/Wiki/CMake/Tutorials描述/ Exporting_and_Importing_Targets) – user3159253
@ user3159253謝謝!但是,如何將'target_include_directories(foo PUBLIC ...)'添加到我的'IMPORTED目標'上?我得到一個錯誤'不能指定包含目錄爲導入的目標「foo」。# –
請參閱[this](http://stackoverflow.com/questions/25907478/possible-to-add-an-imported-library-to -target-link-libraries-that-care-care-of):)同時檢查這個[issue](https://cmake.org/Bug/view.php?id=15689)所以現在看來你有使用'set_target_properties(... INTERFACE_INCLUDE_DIRECTORIES ...)'。看起來很醜,但有希望工作 – user3159253