【CMake教程】(五)CMake 配置install打包

2021-02-20 CNNer

(1)系列教程介紹

  我們編譯生成的可執行文件一般,會生成在當前的編譯路徑下,也就是build或者release路徑下。那麼如何將編譯生成的可執行文件和庫文件打包到一起進行發布那?本片教程我們將講述如何在cmake中配置install的打包路徑。下面我們將以mathlib庫和頭文件為例子進行配置。

(2)CMake 的使用環境和安裝

本教程的使用環境為:

ubutu18.04 lts
gcc version 7.5.0
g++ version 7.5.0
cmake version 3.10.2

安裝cmake:

sudo apt install cmake

(3)設置設置我們的程序輸出為lib文件

  配置庫文件、頭文件和執行文件到install的目錄下,cmake中的install根目錄為CMAKE_INSTALL_PREFIX變量的路徑,如果我們要設置配置路徑可以使用set命令設置CMAKE_INSTALL_PREFIX變量的值來改變路徑。一般默認情況CMAKE_INSTALL_PREFIX變量的值為,在UNIX系統中為:/usr/local,在windows系統中為:c:/Program Files/${PROJECT_NAME}

首先,看一下整體的目錄結構:

|-- tutorial_fourth/

|-- src/

|-- tutorial.cpp

|-- include/

|--TutorialConfig.h.in

|-- mathlib/

|-- CMakeLists.txt

|-- mathlib.h

|-- mathlib.cpp

|-- CMakeLists.txt

根目錄下的CMakeLists.txt文件為:

# 設置cmake的最低版本
cmake_minimum_required(VERSION 3.10)

# 設置工程名稱 和版本
project(tutorial VERSION 1.0)

# 設置指定的C++編譯器版本是必須的,如果不設置,或者為OFF,則指定版本不可用時,會使用上一版本。
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 指定為C++11 版本
set(CMAKE_CXX_STANDARD 11)

# 提供一個選項是OFF或者ON,如果沒有初始值被提供則默認使用OFF
option(USE_MYMATH "Use tutorial provided math implementation" ON)

# 指定版本號的配置文件
configure_file(include/TutorialConfig.h.in TutorialConfig.h)

# 判斷變量USE_MYMATH是否設置了ON,如果設置了配置MathFunctions library
if(USE_MYMATH)
# 添加一個名字為MathFunctions的子編譯路徑
add_subdirectory(mathlib)

# 列出MathFunctions庫的所有項目,並添加到外部庫變量EXTRA_LIBS中
list(APPEND EXTRA_LIBS mathlib)

# 將子路徑"${PROJECT_SOURCE_DIR}/mathlib"添加到外部路徑變量EXTRA_INCLUDES中
list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/mathlib")
endif()

# 增加生成可執行文件,生成的程序名稱為:tutorial_first
add_executable(tutorial src/tutorial.cpp)

# 對目標的外部庫進行連結操作,需要放在定義了tutorial以後
target_link_libraries(tutorial PUBLIC ${EXTRA_LIBS})

# 為指定項目添加 include 路徑,需要放在定義了tutorial以後
target_include_directories(tutorial PUBLIC
"${PROJECT_BINARY_DIR}"
${EXTRA_INCLUDES}
)

# 下面配置install,根目錄為 CMAKE_INSTALL_PREFIX變量中的路徑

# 配置可執行文件到安裝路徑 CMAKE_INSTALL_PREFIX的bin中
install(TARGETS tutorial DESTINATION bin)

# 配置程序的頭文件到安裝路徑 CMAKE_INSTALL_PREFIX的include文件中
install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
DESTINATION include
)

mathlib路徑下CMakeLists.txt文件為:


# 生成庫文件名為mathlib的靜態庫
add_library(mathlib STATIC mysqrt.cpp) # 可以配置STATIC、SHARED和MODULE

# 設置動態庫的版本 為1.2
SET_TARGET_PROPERTIES(mathlib PROPERTIES VERSION 1.2 SOVERSION 1)

# 將程序段額依賴庫輸出到安裝路徑 CMAKE_INSTALL_PREFIX的lib文件夾中
install(TARGETS mathlib DESTINATION lib)

# 將文件mathlib.h輸出到安裝目錄 CMAKE_INSTALL_PREFIX下的include文件夾中
install(FILES mathlib.h DESTINATION include)

命令使用:
install: 配置程序打包過程中的目標(TARGETS)、文件(FILES)、路徑(DIRECTORY)、代碼(CODE)和輸出配置(EXPORT)

install(TARGETS <target>... [...])
install({FILES | PROGRAMS} <file>... [...])
install(DIRECTORY <dir>... [...])
install(SCRIPT <file> [...])
install(CODE <code> [...])
install(EXPORT <export-name> [...])

使用demo:

install(TARGETS myExe mySharedLib myStaticLib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib/static)

(4)使用CMake進行編譯

CMake在生成文件的過程中會生成很多中間緩存文件,為了使項目更簡潔,文件路徑更清楚,一般會在項目的root目錄下建立一個文件夾,用於存儲CMake生成的中間文件。而一般使用的文件家名稱為build或者release。下面是使用命令:

# 進入項目的root目錄,本文為:tutorial_first
cd tutorial

# 創建存儲緩存文件的文件夾,build
mkdir build

# 使用CMake命令生成makefile文件
cmake ..

# 使用make命令進行編譯
cmake --build .

實時分享CVPR、ECCV等會議,關注深度學習、自動駕駛領域,我們期待你的加入。點擊上方「CNNer」,選擇加「星標」或「置頂」精選乾貨,當日達。

       

長按關注▲                       長按加微信▲

備註:研究方向+地點+學校/公司+暱稱,更快通過申請,長按加細分領域技術交流群,目前有細分領域:圖像分割、圖像目標檢測、論文寫作、車道檢測、模型優化、目標跟蹤、SLAM、點雲處理(分割檢測)、深度學習。

PS:騰訊最近更改公眾號推送規則,文章推送不在按照時間排序,而是通過智能推薦算法有選擇的推送文章,為了避免收不到文章,看完文章您可以點擊一下右下角的"在看",以後發文章就會第一時間推送到你面前。

獲取完整項目工程,公眾回覆:CMakeDemo5

聲明:文章來自於網絡,僅用於學習分享,版權歸原作者所有,侵權請加上文微信聯繫刪除。

點個「在看」,讓我知道你的愛👇👇

相關焦點

  • 【CMake教程】(三)CMake 配置指定C++11編譯的標準
    (1)系列教程介紹  本文主要講述如何使用CMakeLists.txt,指定當前程序的C++編譯標準。
  • CMAKE入門實戰
    project(cmakeLearn)add_executable(main main.cpp)cmake_minimum_required:指定運行此配置文件所需的 CMake 的最低版本;project:參數值是 cmakeLearn
  • xmake vs cmake對比分析
    target_compile_options(test PRIVATE $<$<CONFIG:Release>:-Ox -fp:fast>)endif()target_sources(test PRIVATE    src/main.c)自定義腳本xmakexmake可以在編譯構建的不同階段(包括編譯、安裝、打包
  • CERN ROOT開發環境的cmake配置
    本文簡單介紹下cmake管理配置ROOT項目的方法,先上總圖本項目有一個頭文件,兩個源文件以及一個cmake配置文件組成。序號文件名文件說明1CMakeLists.txt Cmake配置文件,用於組織項目的編譯需要的庫、編譯的過程、編譯結果2CMakeLists.txt.userQtcreator打開cmake項目時生成的用戶緩存文件,可忽略3CMakeLists.txt.user.4825354某個緩存文件的版本,可忽略4helloworld.h頭文件5helloworld.cpp源文件
  • 基於clion+cmake+mingw 搭建opencv c++開發環境
    目錄一,Clion 安裝,配置二,MinGW 安裝、配置三,CMake 安裝、配置四、Opencv安裝、配置五、Clion 開發環境配置友情提示:不翻牆別想搭建成功!我最終搭建成功是依靠網友們的網盤資源,感謝分享!
  • 用 CMake 構建 Python C/C++ 擴展
    通常構建 Python C/C++ 擴展會使用 distutils[2] 的 Extension[3] 類,需要在 setup.py 中配置頭文件包含路徑 include_dirs、C/C++ 源文件路徑 sources 等,比如下面這個Python 官方文檔上的例子[4]:from
  • Cmake 入門簡介
    一、 什麼是CMakeCMake是一個比make更高級的編譯配置工具,支持不同平臺、不同的編譯器,生成相應的Makefile或者vcproj項目(virtual studio 項目文件)。通過編寫CMakeLists.txt,可以控制生成的Makefile,從而控制編譯過程。
  • CMake的安裝及簡單使用
    因此,對於大多數項目,應當考慮使用更自動化一些的 cmake或者autotools來生成makefile,而不是上來就動手編寫。總之,項目構建工具能夠幫我們在不同平臺上更好地組織和管理我們的代碼及其編譯過程,這是我們使用它的主要原因。cmake的主要特點cmake和autotools是不同的項目管理工具,有各自的特點和用戶群。
  • cmake終極奧義
    對於上面的 CMakeLists.txt 文件,依次出現了幾個命令:cmake_minimum_required:指定運行此配置文件所需的 CMake 的最低版本;project:參數值是 demo1,該命令表示項目的名稱是 demo1 。
  • CMake環境搭建
    (VERSION 2.8)project(cmake_test)add_executable(${PROJECT_NAME} "main.cpp")1.CMake官網下載https://cmake.org/download/2. linux中安裝CMake環境編譯好的二進位文件安裝直接下載二進位文件直接執行sh解壓     tar -xvf xxxx.tar.gz.
  • CMake入門
    mkdir build && cd buildcmake ..makemake install在這個例子中,我們建了一個 build 文件夾用於執行 cmake 指令,這種做法叫做外部編譯(out-of-source-build)。注意 cmake .. 這後邊有個 .. 這是用於告訴 CMAKE CMakeLists.txt 在哪個文件夾下。
  • LibreCAD的CMake構建
    Qt配置方式在根目錄將Qt所在路徑添加到CMAKE_PREFIX_PATH變量中,類似於:##如何使用CMake配置Qt參見以下連結##https://doc.qt.io/qt-5/cmake-get-started.htmllist(APPEND CMAKE_PREFIX_PATH "E:/
  • linux | cmake的快速使用
    安裝CMake$ sudo apt-get install cmake#檢測安裝是否成功$ cmake --version  源碼連結:https://github.com/jiejieTop/cmake使用流程CMake工具使用一個名為CMakeLists.txt
  • cmake簡介
    自動構建系統自動構建系統是一種能夠自動完成原始碼的編譯,打包,單元測試,部署等工作的軟體,具體定義可以參考維基百科。make通過讀取Makefile文件,可以自動完成編譯打包等等一系列的工作。target1 target2 target3 cmd其中,target0是新定義的target,而target1到target3是target0所依賴的target,cmd是shell命令,用來告訴make程序如何生成target0,一般來說是調用編譯器的命令或者是打包命令
  • CMake實戰教程(二)
    cmake PATH那麼很顯然,它可以是相對路徑而不是絕對路徑,畢竟點『.』  表示當前路徑, 點點『..』 表示上一級路徑,那麼我們可以新建一個build目錄,然後在build目錄下去運行:cmake ..
  • 使用CMake部署Qt應用程式
    可以調整其輸出位置,假設要根據不同的配置(Debug、Release等)輸出到構建目錄,則在工程的主CMakeLists.txt中通過這種方式定義:if(NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR
  • CMake,大型項目採用的構建工具
    跨平臺,並可生成native編譯配置文件,在Linux平臺,生成makefile。在蘋果平臺,生成xcode。在Windows平臺,生成MSVC的工程文件。能夠管理大型項目。簡化編譯構建過程和編譯過程,工具鏈也非常簡單:cmake+make。高效率,比autotools效率快。主要原因:CMake在工具鏈中沒有libtool。
  • Cmake基礎知識講解
    CMake主要是編寫CMakeLists.txt文件,然後用cmake命令將CMakeLists.txt文件轉化為make所需要的makefile文件,最後用make命令編譯源碼生成可執行程序或共享庫(so(shared object))。
  • Ubuntu 18.04下安裝最新CMake及CMake簡單使用
    cmake所做的事其實就是告訴編譯器如何去編譯連結原始碼。你也許想問不是有makefile嗎,為什麼還要它?這裡就牽涉到跨平臺問題。在Windows平臺下是通過project文件去管理這些的,如果不用cmake,那我們為Windows和Linux系統就要寫對應的project文件和makefile文件,這無疑是一件繁瑣的事,而我們只要編寫一次cmake,就可以用在各個平臺,而且其語法也簡單。
  • CMake實戰教程(三)
    前言CMake實戰教程(一)CMake實戰教程(二)從本小節開始,後面所有的構建我們都將採用 out-of-source build 外部構建的方式去編寫構建工程代碼,構建目錄是工程目錄下的 build 目錄。