Mac 下 CMake 的配置與使用

文章目錄

  • 安裝與配置
  • 編譯單個源文件
    • 編譯前的準備
    • 開始編譯
  • 編譯多個源文件
    • 多個源文件在同一目錄下
    • 多個源文件在不同目錄下
    • math 目錄下的 CMakeLists.txt
    • 根目錄的 CMakeLists.txt
      • option 選項
  • 導入外部庫
    • 本地導入(find_package)
    • 外部導入(FetchContent)
  • 安裝與測試
    • 安裝
    • 測試
  • 生成安裝包

安裝與配置

  1. 進入 官網下載 dmg 文件:
    請添加圖片描述

(在紅圈中根據自己的Mac版本任選一個 dmg 下載)

  1. 安裝完成后,從菜單欄選擇:Tools–How to Install For Command Line Use請添加圖片描述

  2. 在終端命令行中輸入彈出彈窗中第二項 to install symlinks to '/usr/local/bin', run: 的指令:
    請添加圖片描述

  3. 檢查是否配置成功:
    請添加圖片描述

cmake --version 可以正常識別,配置成功。


編譯單個源文件

編譯前的準備

使用 CMake 進行編譯之前需要具備三大內容:
請添加圖片描述

他們的作用及內容如下:

源文件 main.cpp

#include <iostream>int main(int argc, const char * argv[]) {// insert code here...std::cout << "Hello, World!\n";return 0;
}

cmake 構建規則 CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.6) 
# cmake最低版本需求,不加入此行會受到警告信息PROJECT(HELLO) 
# 項目名稱,同時會自動生成 PROJECT_NAME 變量,
# 使用${PROJECT_NAME} 即可訪問到 hello_cmake。AUX_SOURCE_DIRECTORY(. SRC_LIST) 
# 把當前目錄(.)下所有源代碼文件和頭文件加入變量SRC_LISTADD_EXECUTABLE(hello ${SRC_LIST}) # 生成應用程序 hello

在編譯單個文件時,也可以不添加第三句規則,而是直接在第四句規則中指定編譯的文件,例如,刪除第三句,并將第四句改為如下內容,本編譯規則依然有效:

ADD_EXECUTABLE(hello main.cpp) #生成應用程序 hello

AUX_SOURCE_DIRECTORY

  • 第一個參數是目錄的路徑
  • 第二個參數是變量名。當我們使用這個命令時,就會將指定目錄下的所有源文件保存到指定的變量名中。
  • 這里將名為 main.cpp 的源文件編譯成一個名稱為 hello 的可執行文件。

保存臨時構建文件和目標文件的文件夾 build

  • 本示例中,該步驟本質上是創建一個可以位于文件系統上任何位置的構建文件夾(這里只是選擇了在當前文件夾中創建)。 所有臨時構建和目標文件都位于此目錄中,以保持源代碼樹的整潔。該種構建方式為外部構建
  • 其實也可以沒有這個文件夾,而是以內部構建的形式直接在源文件目錄構建項目,只是會導致臨時文件和源代碼放在一起,不好清理。

開始編譯

  • 通過 cmake .. 命令開始進行編譯:

請添加圖片描述

  • 使用 cmake 生成的 makefile 編譯得到可執行文件

請添加圖片描述

  • 此時在當前目錄下,就會生成可執行文件 hello

請添加圖片描述

  • 將其運行查看是否成功編譯:

請添加圖片描述


編譯多個源文件

多個源文件在同一目錄下

與編譯單個源文件相比,難點主要是對 AUX_SOURCE_DIRECTORY 命令的使用。

如果不想使用 AUX_SOURCE_DIRECTORY 命令,也可以使用 set 來手動將多個源文件保存到變量名中:

set(SRC_LISTother.cppmain.cpp
)

多個源文件在不同目錄下

.
├── CMakeLists.txt
├── main.cc
└── math├── CMakeLists.txt├── MathFunctions.cc└── MathFunctions.h

在多個目錄下有著多個源文件的情況下,需要在每個目錄中都編寫一個 CMakeLists.txt。這里為了方便,我們可以將 math 里的文件編譯為一個靜態庫再通過 main 函數調用。

math 目錄下的 CMakeLists.txt

math 目錄下的 CMakeLists.txt 主要做的事是將當前目錄下的文件編譯為一個靜態庫:

# 查找當前目錄下的所有源文件
# 并將名稱保存到 DIR_LIB_SRCS 變量
aux_source_directory(. DIR_LIB_SRCS)# 指定生成 MathFunctions 鏈接庫
add_library (MathFunctions ${DIR_LIB_SRCS})
  • add_library:用于從某些源文件創建一個庫,默認生成在構建文件夾。
    • 第一個參數為庫名(不需要 lib 前綴,會自動添加)
    • 第二個參數用于指定 SHARED(動態庫)、STATIC(靜態庫)(如果不寫,則通過全局的 BUILD_SHARED_LIBSFALSETRUE 來指定。上例中就沒有寫)
    • 第三個參數即為源文件列表。

根目錄的 CMakeLists.txt

# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)# 項目信息
project (Demo3)# 查找目錄下的所有源文件
# 并將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)# 添加 math 子目錄
add_subdirectory(math)# 指定生成目標
add_executable(Demo ${DIR_SRCS})# 添加鏈接庫
target_link_libraries(Demo MathFunctions)
  • add_subdirectory:用于表示該項目包含一個子目錄,此時會去處理子目錄下的 CMakeLists.txt 與源文件。
  • target_link_libraries:該命令用于指明可執行文件 Demo 需要鏈接 MathFunctions 庫。
    • 第一個參數為可執行文件名
    • 第二個參數為訪問權限(PUBLICPRIVATEINTERFACE,默認為 PUBLIC
    • 第三個參數為庫名(這里庫名使用了 math 目錄下的 CMakeLists.txt 中生成的 MathFunctions 鏈接庫)
    • 【后兩個參數可以為多個】

option 選項

面對 庫文件很大 或者 庫文件依賴第三方庫 的時候,我們可能希望將 該庫文件作為一個可選項(而不是非得鏈接不可)

  1. 這里仍以 MathFunctions 為例進行實現。首先在 頂層CMakeLists.txt 文件添加一個選項 option ,其基本格式如下:
option (USE_MYMATH "should we use our own math functions?" ON) 
  • 第一個參數定義選項名稱。
  • 第二個參數說明選項的含義。
  • 第三個參數定義選項默認狀態,一般是 OFF 或者 ON,除去 ON 之外,其他所有值都被認為是 OFF
  1. 接下來就是將構建和連接 MathFunctions 設置為可選項。修改 頂層CMakeLists.txt 文件如下所示:
if (USE_MYMATH)include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")add_subdirectory (math)# 將 ${EXTRA_LIBS} 變量中舊有的內容和 MathFunctions # 都加入到EXTRA_LIBS變量中set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)# add the executable
add_executable(Demo ${DIR_SRCS})
target_link_libraries(Demo ${EXTRA_LIBS})

PS: 這里我們使用了 USE_MYMATH 這個宏,倘若在源碼中也想使用它,那么需要由 CMake 通過在配置文件 Config.h 添加以下代碼:

#cmakedefine USE_MYMATH

之后源碼 include 該頭文件(Config.h)來實現。


導入外部庫

本地導入(find_package)

本節示例的目錄結構如下:

.
├── CMakeLists.txt
├── main.cpp
└── README.adoc

boost 為例,演示如何導入一個本地的第三方庫, MakeLists.txt 內容如下:

cmake_minimum_required(VERSION 3.5)# Set the project name
project (third_party_include)
# 使用庫文件系統和系統查找 boost install
# 注意這是第三方庫,而不是自己生成的靜態動態庫
find_package(Boost 1.46.1 REQUIRED COMPONENTS filesystem system)
if(Boost_FOUND)message ("boost found")
else()message (FATAL_ERROR "Cannot find Boost")
endif()# Add an executable
add_executable(third_party_include main.cpp)# link against the boost libraries
target_link_libraries( third_party_includePRIVATEBoost::filesystem
)

使用 find_package 命令來在本地搜索對應的第三方庫,它的參數的含義如下:

  • Boost 代表需要查詢的庫名稱;
  • 1.46.1 代表需要庫的最低版本;
  • REQUIRED 表示該庫是必須的,如果找不到會報錯;
  • COMPONENTS 用于檢測該庫的對應組件是否存在,如果不存在則認為找到的庫不滿足條件。
  • filesystemsystem 代表搜索的位置,分別是 庫文件系統文件系統

外部導入(FetchContent)

FetchContent3.11.0 版本開始提供的功能,只需要一個 URL 或者 Git 倉庫即可引入一個庫,這里以 GoogleTest 庫為例:

cmake_minimum_required(VERSION 3.14)
project(my_project)# GoogleTest requires at least C++11
set(CMAKE_CXX_STANDARD 11)include(FetchContent)
FetchContent_Declare(googletestURL https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip
)
# 對于Windows:防止重寫父項目的編譯器/鏈接器設置
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
  1. include(FetchContent) :表示引入 FetchContent
  2. FetchContent_Declare(第三方庫) :獲取第三方庫,可以是一個 URL 或者一個 Git 倉庫。
  3. FetchContent_MakeAvailable(第三方庫) :將這個第三方庫引入項目。
  4. target_link_libraries(主項目 PRIVATE 子模塊::子模塊) :鏈接這個第三方庫。

安裝與測試

安裝

示例的目錄結構如下:

.
├── CMakeLists.txt
├── config.h.in
├── License.txt
├── main.cc
└── math├── CMakeLists.txt├── MathFunctions.cc└── MathFunctions.h

math 目錄下的 CMakeLists.txt

# 查找當前目錄下的所有源文件
# 并將名稱保存到 DIR_LIB_SRCS 變量
aux_source_directory(. DIR_LIB_SRCS)# 指定生成 MathFunctions 鏈接庫
add_library (MathFunctions ${DIR_LIB_SRCS})# 指定 MathFunctions 庫的安裝路徑
install (TARGETS MathFunctions DESTINATION lib)
install (FILES MathFunctions.h DESTINATION include)

通過 install 命令:

  • 靜態庫 MathFunctions 安裝到 /usr/local/lib 目錄下
  • 頭文件 MathFunctions.h 安裝到 /usr/local/include 目錄下。

根目錄 下的 CMakeLists.txt 中的 install 內容:

# 指定安裝路徑
install (TARGETS Demo DESTINATION bin)
install (FILES "${PROJECT_BINARY_DIR}/config.h"DESTINATION include)
  • 可執行程序 Demo 安裝到了 /usr/local/lib 目錄下;
  • 頭文件 config.h 安裝到 /usr/local/lib 目錄下。

PS:/usr/local/ 是默認安裝的根目錄,可以通過修改 CMAKE_INSTALL_PREFIX 變量來指定文件安裝文件的根目錄


測試

CMake 提供了一個名為 CTest 的測試工具。它通過 add_test 命令來進行相關測試,項目根目錄的 CMakeLists.txt 文件中的 add_test 命令內容如下:

# 啟用測試
enable_testing()# 測試程序是否成功運行
add_test (test_run Demo 5 2)# 測試幫助信息是否可以正常提示
add_test (test_usage Demo)
set_tests_properties (test_usagePROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")# 測試 5 的平方
# add_test (test_5_2 Demo 5 2)# set_tests_properties (test_5_2
#  PROPERTIES PASS_REGULAR_EXPRESSION "is 25")# 測試 10 的 5 次方
# add_test (test_10_5 Demo 10 5)# set_tests_properties (test_10_5
#  PROPERTIES PASS_REGULAR_EXPRESSION "is 100000")# 測試 2 的 10 次方
# add_test (test_2_10 Demo 2 10)# set_tests_properties (test_2_10
#  PROPERTIES PASS_REGULAR_EXPRESSION "is 1024")# 如果覺得上述過程過于復雜
# 也可以定義一個宏,用來簡化測試工作
macro (do_test arg1 arg2 result)add_test (test_${arg1}_${arg2} Demo ${arg1} ${arg2})set_tests_properties (test_${arg1}_${arg2}PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro (do_test)# 利用 do_test 宏,測試一系列數據
do_test (5 2 "is 25")
do_test (10 5 "is 100000")
do_test (2 10 "is 1024")
  • enable_testing:用于啟動測試。
  • add_test:用于添加測試
    • 第一個參數為測試名;
    • 第二個參數為可執行程序;
    • 剩下的為可執行程序的參數。
  • set_tests_properties:測試的提示信息。
  • PASS_REGULAR_EXPRESSION :測試屬性(正則表達式)來驗證輸出中是否包含了特定的字符串。這里驗證開方是否正確并且在計算錯誤時輸出輸出對應信息。
  • macro:宏,用于編寫一個重復性操作來簡化測試用例的編寫。
  • do_test:編寫的測試宏。

生成安裝包

如果想要生成安裝包,則需要使用 CMake 提供的打包工具 CPack。此時需要在 CMakeLists.txt 中添加以下內容:

# 構建一個 CPack 安裝包
include (InstallRequiredSystemLibraries)
set (CPACK_RESOURCE_FILE_LICENSE"${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set (CPACK_PACKAGE_VERSION_MAJOR "${Demo_VERSION_MAJOR}")
set (CPACK_PACKAGE_VERSION_MINOR "${Demo_VERSION_MINOR}")
include (CPack)
  • include (InstallRequiredSystemLibraries):導入 InstallRequiredSystemLibraries 模塊。
  • 設置一些 CPack 相關變量。
  • include (CPack):導入 CPack 模塊。

接著執行 cmakemake 構建工程,此時再執行 cpack 命令即可生成安裝包:

#生成二進制安裝包
cpack -C CPackConfig.cmake#生成源碼安裝包
cpack -C CPackSourceConfig.cmake

當命令執行成功后,就會在當前目錄下生成 *.sh*.tar.gz*.tar.Z 這三個格式的安裝包。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443678.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443678.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443678.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

五軸編程_沙井萬豐數控數控編程五軸編程那個軟件好用

沙井萬豐數控數控編程五軸編程那個軟件好用設計需要掌握很高很全面的知識和技能&#xff0c;模具做的好&#xff0c;產品質量好&#xff0c;模具結構合理&#xff0c;生產效率高&#xff0c;工廠效益好。正因如此&#xff0c;模具技術工在外打工的工資都非常的高。少則每月幾千…

Linux學習:第二章-Linux安裝

一虛擬機使用 VMware主要特點&#xff1a; 1、不需要分區或重新開機就能在同一臺PC上使用兩種以上的操作系統 2、本機系統可以與虛擬機系統網絡通信 3、可以設定并且隨時修改虛擬機操作系統的硬件環境 二安裝方式 圖形安裝&#xff1a;直接回車 字符安裝&#xff1a;linux tex…

keil3如何放大字體_國潮海報不會做?送你國風字體+圖案筆刷+PSD素材+包裝樣機...

有很多朋友都問帶魚&#xff0c;國潮風的海報到底應該怎么做呢&#xff1f;首先你要知道什么是國潮風&#xff1a;國潮風就是現代文化和古代文化的碰撞&#xff0c;是年輕人的態度&#xff01;那么應該如何構圖如何設計呢&#xff1f;如何配色如何搭配字體呢&#xff1f;這些方…

Google 開源項目風格指南學習筆記——C++篇

文章目錄前言0. 縮寫名詞解釋1. 頭文件1.1. Self-contained 頭文件1.2. 頭文件保護1.3. 前置聲明1.4 內聯函數1.5. #include 的路徑及順序2. 作用域2.1. 命名空間2.2. 非成員函數、靜態成員函數和全局函數2.3. 局部變量2.4. 靜態和全局變量3. 類3.1. 構造函數的職責3.2. 隱式類…

hiveserver2啟動不起來_給愛車配個充電寶,70邁汽車應急啟動電源,讓你遠離搭電小廣告...

說到汽車應急啟動其實我有切身的痛&#xff0c;在哈爾濱零下35的嚴冬&#xff0c;晚上帶著女神吃完飯&#xff0c;高高興興地吃完以后一上車&#xff0c;發現電瓶被凍沒電了&#xff0c;天知道當時有多尷尬。馬上叫了保險公司過來給搭電&#xff0c;結果在飯店從晚上8點一直等到…

Windows 下 VS 配置 OpenGL 環境

文章目錄前言獲取 GLFW打開 VS前言 感謝B站同學搬運YouTube上的教學視頻。 獲取 GLFW 從官網上下載GLFW macOS下64位二進制文件 打開 VS 新建解決方案 OpenGL test&#xff0c;并在解決方案中新建文件夾 Dependencies&#xff1a; 從下載好的 glfw 文件夾中找到最新版鏈接…

ubuntu 網卡雙網口 配置_無線網卡m2 ngff keya keye、minipcie接口改轉多口有線網卡實現軟路...

小型主板及筆記本中的無線網卡m2ngffkeyakeye接口&#xff08;CNVI除外&#xff09;通過m2ngffkeyae轉接pcie1x轉接板&#xff0c;或者無線網卡的minipcie接口&#xff0c;通過minipcie轉接pcie1x轉接板可以改裝有線網卡板卡&#xff0c;來實現軟路由功能。m2ngffkeyae轉接pcie…

OpenGL | 通過繪制一個三角形來入門 OpenGL 圖形渲染管線

文章目錄前言什么是 OpenGl &#xff1f;回顧openGL 的 Object顯存結構工作階段通過頂點緩沖對象將頂點數據初始化至緩沖中標準化設備坐標頂點緩沖對象 VBOglGenBuffersglBindBufferglBufferData建立了一個頂點和一個片段著色器著色器是什么&#xff1f;為什么需要使用著色器&a…

javascript特效_如何在網頁添加鼠標點擊特效

經常有同學問我怎么做到的&#xff0c;本論壇屬于DZ當然用的是插件啦。偶然在網上找到一個關于wordpress的特效代碼&#xff0c;分享給大家。WordPress 添加鼠標點擊特效實際上這種教程在網上搜索一下有一大堆&#xff0c;已經是各大博主玩爛的東西了。不過既然給自己的博客加上…

Android |雙鎖單例模式中使用Context如何避免內存泄露的 Warning 提示

文章目錄問題解決方法拓展問題 在Android開發中&#xff0c;經常會將工具類以單例模式的方法實現&#xff0c;而工具類中又總不可避免的用到 Context &#xff0c;例如&#xff1a; public class MySingleton {private static volatile MySingleton instance;private final C…

android nio debug模式正常 release包crash_Flutter包大小治理上的探索與實踐

Flutter作為一種全新的響應式、跨平臺、高性能的移動開發框架&#xff0c;在性能、穩定性和多端體驗一致上都有著較好的表現&#xff0c;自開源以來&#xff0c;已經受到越來越多開發者的喜愛。但是&#xff0c;Flutter的引入往往帶來包體積的增大&#xff0c;給很多研發團隊帶…

Linux學習:第三章-Linux常用命令-1

提示符&#xff1a; [rootlocalhost ~]# [登錄用戶名主機名 當前所在目錄]提示符 ~家目錄 /root /home/aa 提示符&#xff1a; #超級用戶 $普通用戶 一 linux命令的格式1、命令 [選項] [參數]lslist顯示目錄下內容 ①命令名稱&#xff1a;ls 命令英文原意&#xff1a;list 命令…

Leetcode每日一題:使括號有效的最少添加(括號匹配)

文章目錄題目解析貪心趣解題目 只有滿足下面幾點之一&#xff0c;括號字符串才是有效的&#xff1a; 它是一個空字符串&#xff0c;或者它可以被寫成 AB &#xff08;A 與 B 連接&#xff09;, 其中 A 和 B 都是有效字符串&#xff0c;或者它可以被寫作 (A)&#xff0c;其中 …

yolov5搭建環境_Yolov5環境配置和訓練私有數據,YOLOv5,以及,私人

1.使用anaconda安裝python3.8的環境conda create -n yolo5 python3.8#anaconda下載地址: https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/2.安裝pytorch1.6 torchvision0.7conda install pytorch1.6 torchvision0.7 cudatoolkit10.13.安裝相關包pip install opencv-py…

sam格式的結構和意義_各種格式的練字本,對寫字真有幫助嗎

圖片來源于筆勢通各種格式的練字本現在越來越多&#xff0c;目的主要是便于學生把握好筆畫的位置和布局&#xff0c;從而把整個字的結構處理好&#xff0c;常見的有米字格&#xff0c;回宮格等。這些練字本對于初學者來說肯定是有幫助的&#xff0c;特別是低年級學生。當然隨著…

硬件結構圖_那曲地表水電子除垢儀結構圖

那曲地表水電子除垢儀結構圖水處理設備也應斷電停止使用&#xff0c;系統長期停止運行或季節性停止運行&#xff0c;在系統停止運行前&#xff0c;在水中投加適量緩蝕劑&#xff0c;并采取滿水濕保護的措施&#xff0c;以減小腐蝕&#xff0c;保護系統。開啟進水閥檢查無誤后電…

dtm文件生成等高線 lisp_南方cass如何用圖面高程點生成等高線

展開全部1、首先點擊cass菜單欄中的等高線菜單下的建立DTM&#xff0c;彈出對話框。可以有兩種方式建32313133353236313431303231363533e58685e5aeb931333431356665立DTM&#xff0c;由數據文件生成或者由圖面高程點生成&#xff0c;第一種直接在對話框中選擇相應的數據文件&am…

postgresql興建用戶_PostgreSQL 12.2, 11.7, 10.12, 9.6.17, 9.5.21, 和 9.

### **譯者&#xff1a;朱君鵬**### **發表于2020年2月13日 作者&#xff1a;PostgreSQL全球開發小組**#### 全球開發小組已發布的更新涵蓋所有支持的版本&#xff0c;包括12.2&#xff0c;11.7&#xff0c;10.12&#xff0c;9.6.17&#xff0c;9.5.21和9.4.26。該版本修正了一…

Linux學習:第三章-Linux常用命令-2

一文件操作命令 1&#xff09;創建空文件或修改文件時間 touch文件名 命令名稱&#xff1a;touch 命令所在路徑&#xff1a;/bin/touch 執行權限&#xff1a;所有用戶 2&#xff09;刪除 rm-rf文件名 -r刪除目錄 -f強制 命令名稱&#xff1a;rm 命令英文原意&#xff1a;remove…

雙屏怎么快速切換鼠標_在筆記本上實現雙屏設計,怎么做到的?

如果給你的筆記本電腦安裝兩個屏幕&#xff0c;你會用來干什么&#xff1f;是上班時間主屏幕放著PPT&#xff0c;副屏幕偷摸玩游戲&#xff1b;還是主屏幕玩游戲&#xff0c;副屏幕刷刷B站視頻&#xff1b;亦或是主屏幕P著圖&#xff0c;副屏幕在網上找找能用的素材&#xff1f…