1. 程式人生 > 其它 >cmake linux模板 多目錄_CMake之install方法的使用

cmake linux模板 多目錄_CMake之install方法的使用

技術標籤:cmake linux模板 多目錄

所有相關程式碼,可以訪問我的github專案,歡迎star。

https://github.com/BrightXiaoHan/CMakeTutorial​github.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)

來引用我們的函式庫了。