cmake linux模板 多目錄_CMake之install方法的使用
技術標籤:cmake linux模板 多目錄
所有相關程式碼,可以訪問我的github專案,歡迎star。
https://github.com/BrightXiaoHan/CMakeTutorialgithub.com本文主要介紹如何將專案生成的庫檔案、標頭檔案、可執行檔案或相關檔案等安裝到指定位置(系統目錄,或發行包目錄)。在cmake中,這主要是通過install
方法在CMakeLists.txt中配置,make install
命令安裝相關檔案來實現的。
編寫一個簡單的庫
編寫一個計算整數和浮點數之和的庫函式mymath
mymath.h
#ifndef MYMATH_H #define MYMATH_H int add(int, int); double add(double, double); #endif
http://mymath.cc
#include "mymath.h"
int add(int a, int b){
return a+b;
}
double add(double a, double b){
return a+b;
}
可執行程式http://mymathApp.cc
#include <iostream> #include "mymath.h" using namespace std; int main(int argc, char const *argv[]) { double a = add(1.1, 1.1); int b = add(1, 1); cout << "1.1加1.1等於" << a <<endl; cout << "1加1等於" << b <<endl; return 0; }
在CMakeLists中新增配置
cmake_minimum_required(VERSION 3.0) project(Installation VERSION 1.0) # 如果想生成靜態庫,使用下面的語句 # add_library(mymath mymath.cc) # target_include_directories(mymath PUBLIC ${CMAKE_SOURCE_DIR}/include) # 如果想生成動態庫,使用下面的語句 add_library(mymath SHARED mymath.cc) target_include_directories(mymath PRIVATE ${CMAKE_SOURCE_DIR}/include) set_target_properties(mymath PROPERTIES PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/mymath.h) # 生成可執行檔案 add_executable(mymathapp mymathApp.cc) target_link_libraries(mymathapp mymath) target_include_directories(mymathapp PRIVATE ${CMAKE_SOURCE_DIR}/include)
接下來我們為生成的target配置安裝目錄。install
方法的基礎用法如下
install(TARGETS MyLib
EXPORT MyLibTargets
LIBRARY DESTINATION lib # 動態庫安裝路徑
ARCHIVE DESTINATION lib # 靜態庫安裝路徑
RUNTIME DESTINATION bin # 可執行檔案安裝路徑
PUBLIC_HEADER DESTINATION include # 標頭檔案安裝路徑
)
LIBRARY, ARCHIVE, RUNTIME, PUBLIC_HEADER是可選的,可以根據需要進行選擇。 DESTINATION後面的路徑可以自行制定,根目錄預設為CMAKE_INSTALL_PREFIX
,可以試用set
方法進行指定,如果使用預設值的話,Unix系統的預設值為 /usr/local
, Windows的預設值為 c:/Program Files/${PROJECT_NAME}
。比如字linux系統下若LIBRARY的安裝路徑指定為lib
,即為/usr/local/lib
。所以要安裝mymath mymathapp
我們可以這樣寫
# 將庫檔案,可執行檔案,標頭檔案安裝到指定目錄
install(TARGETS mymath mymathapp
EXPORT MyMathTargets
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
PUBLIC_HEADER DESTINATION include
)
他人如果使用我們編寫的函式庫,安裝完成後,希望可以通過find_package
方法進行引用,這時我們需要怎麼做呢。
首先我們需要生成一個MyMathConfigVersion.cmake
的檔案來宣告版本資訊
# 寫入庫的版本資訊
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
MyMathConfigVersion.cmake
VERSION ${PACKAGE_VERSION}
COMPATIBILITY AnyNewerVersion # 表示該函式庫向下相容
)
其中PACKAGE_VERSION
便是我們在CMakeLists.txt
開頭project(Installation VERSION 1.0)
中宣告的版本號
第二步我們將前面EXPORT MyMathTargets
的資訊寫入到MyLibTargets.cmake
檔案中, 該檔案存放目錄為${CMAKE_INSTALL_PREFIX}/lib/cmake/MyMath
install(EXPORT MyMathTargets
FILE MyLibTargets.cmake
NAMESPACE MyMath::
DESTINATION lib/cmake/MyLib
)
最後我們在原始碼目錄新建一個MyMathConfig.cmake.in
檔案,用於獲取配置過程中的變數,並尋找專案依賴包。如果不一來外部專案的話,可以直接include MyMathTargets.cmake
檔案
include(CMakeFindDependencyMacro)
# 如果想要獲取Config階段的變數,可以使用這個
# set(my-config-var @[email protected])
# 如果你的專案需要依賴其他的庫,可以使用下面語句,用法與find_package相同
# find_dependency(MYDEP REQUIRED)
# Any extra setup
# Add the targets file
include("${CMAKE_CURRENT_LIST_DIR}/MyMathTargets.cmake")
最後在CMakeLists.txt檔案中,配置生成MyMathTargets.cmake
檔案,並一同安裝到${CMAKE_INSTALL_PREFIX}/lib/cmake/MyMath
目錄中。
configure_file(MyMathConfig.cmake.in MyMathConfig.cmake @ONLY)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/MyMathConfig.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/MyMathConfigVersion.cmake"
DESTINATION lib/cmake/MyMath
)
最後我們在其他專案中,就可以使用
find_package(MyMath 1.0)
target_linked_library(otherapp MyMath::mymath)
來引用我們的函式庫了。