您有一個CMake啓用的庫項目。您需要在另一個庫或可執行文件中使用它。如何使用CMake查找並鏈接到圖書館?你可以具有以下優選:如何使用CMake查找並使用install-export和find_package鏈接到庫?
- 寫的鍋爐板代碼儘可能少
- 解耦鏈接庫的內部細節從消費目標
理想情況下,該使用圖書館應該是這樣的:
add_executable(myexe ...)
target_link_libraries(myexe mylib)
您有一個CMake啓用的庫項目。您需要在另一個庫或可執行文件中使用它。如何使用CMake查找並鏈接到圖書館?你可以具有以下優選:如何使用CMake查找並使用install-export和find_package鏈接到庫?
理想情況下,該使用圖書館應該是這樣的:
add_executable(myexe ...)
target_link_libraries(myexe mylib)
讓我演示一下在一個具體的例子一個可能的解決方案:
myapp
項目我們有一個可執行的目標myapp
。我們將它與mylib
鏈接起來,它是在它自己的構建樹中構建的。在myapp
的CMakeLists.txt
我們發現並指定mylib
作爲myexe
依賴:
find_package(mylib REQUIRED)
...
add_executable(myexe ...)
target_link_libraries(myexe mylib)
讓我們來看看如何設置mylib
和myexe
構建,使這項工作。
mylib
項目的mylib
的目錄佈局:
mylib
- CMakeLists.txt
- mylib.c
+ include
- mylib.h # single public header
在mylib
的CMakeLists.txt
我們需要創建目標,並指定其源文件:
add_library(mylib mylib.c include/mylib.h)
公衆標題mylib.h
將包含爲#include "mylib.h"
既通過mylib
和mylib
客戶:
mylib
本身建於mylib
的CMake的項目(如測試)等目標需要找到include/mylib.h
從mylib
源代碼樹的mylib
myexe
)需要在的安裝位置找到include/mylib.h
CMake的允許我們指定既包括mylib
路徑:
target_include_directories(mylib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>)
我們在這裏使用PUBLIC
選擇,因爲需要的mylib
公共接口上這個頭。使用PRIVATE
作爲mylib
內部的包含路徑。
INSTALL_INTERFACE
指定相對於安裝根目錄的路徑,即CMAKE_INSTALL_PREFIX
。要實際安裝公用標頭:
install(FILES include/mylib.h DESTINATION include)
我們還需要安裝庫本身和所謂的配置模塊及相關文件。配置模塊是消耗項目將使用的文件,例如myapp
來查找mylib
並獲取與其鏈接所需的所有參數。它類似於pkg-config的.pc
文件。
我們需要兩個相關的install
命令。第一招:覆蓋所有標準安裝靜態庫,dll
的和so
的位置所需要的目的地
install(TARGETS mylib
EXPORT mylib-targets
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin)
列表。如果你確定你的庫只能作爲一個靜態庫被構建,那麼一個DESTINATION lib
就可以做到。
有趣的部分是EXPORT
選項。它將目標列表(目前只有mylib
)分配給標識mylib-targets
。該標識將在未來命令用來生成和消費項目中安裝一些特殊的文件,這使find_package(mylib)
工作:
install(EXPORT mylib-targets
FILE mylib-config.cmake
DESTINATION lib/cmake/mylib)
此命令生成多個文件:
mylib-config.cmake
文件將被安裝到${CMAKE_INSTALL_PREFIX}/lib/cmake/mylib
這是許多標準位置find_package(mylib)
命令將爲mylib-config.cmake
搜索之一。
mylib
我們需要指定一個可變CMAKE_INSTALL_PREFIX
安裝位置:
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=$PWD/../out ../mylib
,並建立和安裝庫:
cmake --build . --target install
myexe
myexe
需要知道在哪裏尋找mylib
。變量CMAKE_PREFIX_PATH
可以是路徑列表。我們需要指定前面的安裝位置:構建多種配置
通常我們需要建立多種配置(Debug
,Release
)
mkdir build
cd build
cmake -DCMAKE_PREFIX_PATH=$PWD/../out ../mylib
cmake --build .
DEBUG_POSTFIX
屬性的默認值:set(CMAKE_DEBUG_POSTFIX d)
的mylib
庫文件的調試版本將被命名爲(在Windows或mylibd.lib
)libmylibd.lib
。生成的EXPORT
文件將包含修改後的文件名。
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$PWD/../out ../mylib
cmake --build . --target install
您可能需要單獨的編譯目錄的每個配置,也可以重複使用相同的:
如果你使用的makefile風格CMake的發電機,你可以通過設置變量CMAKE_BUILD_TYPE
控制構建配置建立目錄。在這種情況下,爲了安全起見,最好明確地乾淨的構建之前:
cmake --build . --target install --clean-first
如果您使用的是multiconfig IDE發電機,像Xcode
或Visual Studio
,你需要指定編譯時間配置:
cmake -DCMAKE_INSTALL_PREFIX=$PWD/../out ../mylib
cmake --build . --target install --config Release
您可以克隆和構建this repository其中包含mylib
和myexe
項目(在Windows和Linux測試)。
查看CMake documentation。最重要的相關命令有:
和兩個DETA ILED的文章:
[CMake的鏈接到外部庫(可能的重複http://stackoverflow.com/questions/8774593/cmake-link-to-external-圖書館) – usr1234567