2016-04-22 24 views
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". 
+1

我猜你需要導入預建的圖書館,像它這樣做[這裏](https://cmake.org/Wiki/CMake/Tutorials描述/ Exporting_and_Importing_Targets) – user3159253

+0

@ user3159253謝謝!但是,如何將'target_include_directories(foo PUBLIC ...)'添加到我的'IMPORTED目標'上?我得到一個錯誤'不能指定包含目錄爲導入的目標「foo」。# –

+1

請參閱[this](http://stackoverflow.com/questions/25907478/possible-to-add-an-imported-library-to -target-link-libraries-that-c​​are-care-of):)同時檢查這個[issue](https://cmake.org/Bug/view.php?id=15689)所以現在看來​​你有使用'set_target_properties(... INTERFACE_INCLUDE_DIRECTORIES ...)'。看起來很醜,但有希望工作 – user3159253

回答

1
  1. 您需要輸入預建圖書館。 here是教程如何做到這一點。
  2. 要使結果目標「完整」,您需要爲其添加某些屬性。不幸的是,由於this CMake issue,這不能用通常的技術來完成。所以,你必須手動設置這些道具,像this SO QA