c++程序的打包編譯cmake+make

c++打包編譯

  • 1 在不用系統中打包介紹
    • 1.1 linux中打包c++程序的2種方式
    • 1.2 windows中打包c++程序
    • 1.3 cmake+Ninja和cmake+make的兩種方式對比
      • 1.3.1 Ninja是什么(可以認為是make工具的一個替代產品)
      • 1.3.2 cmake+Ninja可以用于linux和windows系統中,編譯效率比cmake+make更高
      • 1.3.3 cmake+make可以用于linux系統中,不要在windows系統中用
    • 1.4 cmake+make的編譯方式只可以用于linux系統中,不能用于windows系統中,為什么還說可以跨平臺使用呢?
    • 1.5 安裝g++、cmake、make軟件
  • 2 linux中第1種g++命令(直接但是復雜,不常用)
  • 3 linux中第2種打包方式cmake命令+make命令(難但是方便,常用)
    • 3.1 編譯的流程
      • 3.1.1 第1步:準備好項目代碼
      • 3.1.2 第2步:編寫CMakeLists.txt文件
      • 3.1.3 第3步:創建指定文件夾并用cmake生成構建系統
      • 3.1.4 第4步:編譯項目
      • 3.1.5 第5步:運行程序
    • 3.2 幾個疑問點解釋
      • 3.2.1 為什么要創建build文件夾
      • 3.2.2 cmake命令為什么是cmake ..
      • 3.2.3 cmake ..為什么能夠找到上級目錄的CMakeLists.txt文件?并沒有指定CMakeLists.txt文件呀?
      • 3.2.4 cmake具體干了什么?
    • 3.3 cmake和make的區別
    • 3.4 第2種cmake+make打包方法為什么能夠實現跨平臺?實現跨平臺是cmake的功勞還是make的功勞?
    • 3.5 只有在linux中編譯c++代碼才能使用第2種cmake+make打包方法,在windows中 使用CMake + 構建工具(如 Make/Ninja/MSBuild) 的組合
  • 4 cmake的1個案例和相關語法
  • 5 make的相關語法進一步介紹

這篇博客是在上一篇博客的基礎上增加了cmake的相關知識,更多打包和第3方庫的情況,可以看下面這篇博客。

c++下程序的運行(第3方庫的安裝及安裝gdal)_c++安裝庫-CSDN博客

1 在不用系統中打包介紹

1.1 linux中打包c++程序的2種方式

linux中工作中打包時,下面的第1種方式g++和第2種方式cmake+make都推薦,更傾向于第2種方式。

c++的2種打包方式

  • 方式一:使用g++編譯器命令:
    第1種方式是使用g++命令,通過g++命令進行打包,但是可能需要一長串打包命令。但是對于簡單的項目,打包命令就比較簡單一些。

  • 方式二:使用cmake和make命令打包:
    編寫CMakeLists.txt文件,通過cmake命令生成對應平臺的makefile文件或.sln文件。最后使用make命令生成可執行程序或者第三方庫。

  • 2種方式的對比:
    g++:
    適合小項目;

第2種方式:
自動處理路徑分隔符、庫依賴等平臺差異。
支持生成多種構建系統(如 Makefile、Ninja、Xcode 項目等)。

1.2 windows中打包c++程序

c++常見的4種打包方式,另外還有好多種,不同的軟件可以都會有自己的編譯方式。

windows中打包文件,工作中只推薦2種方式:
第1種是使用集成開發環境自帶的,比如vs就用vs的打包方式,clion就用clion打包方式。
第2種是用MinGW-win64軟件的g++命令方式打包。

  • 方式一:Visual Studio 的MSVC編譯的方式
    在這里插入圖片描述

  • 方式二:使用cmake和其它構建工具命令打包:
    編寫CMakeLists.txt文件,通過cmake命令生成對應平臺的的makefile文件或.sln文件。最后使用MinGW、Ninja等命令生成可執行程序或者第三方庫。
    在這里插入圖片描述

  • 方式三:使用g++編譯器命令:
    第1種方式是使用g++命令,通過g++命令進行打包,但是可能需要一長串打包命令。但是對于簡單的項目,打包命令就比較簡單一些。

在這里插入圖片描述

  • 方式四:clion軟件的編譯方式
    在這里插入圖片描述

1.3 cmake+Ninja和cmake+make的兩種方式對比

1.3.1 Ninja是什么(可以認為是make工具的一個替代產品)

在這里插入圖片描述

1.3.2 cmake+Ninja可以用于linux和windows系統中,編譯效率比cmake+make更高

在這里插入圖片描述在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

1.3.3 cmake+make可以用于linux系統中,不要在windows系統中用

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

1.4 cmake+make的編譯方式只可以用于linux系統中,不能用于windows系統中,為什么還說可以跨平臺使用呢?

cmake+make的編譯方式只可以用于linux系統中,不能用于windows系統中。
說的跨平臺這個概念方式,實際上專門指的是cmake這種方式,在windows中和linux中寫1個CMakeLists.txt文件,然后就可以使用cmake工具在linux或windows中創建配置中間文件了,這里實現了跨平臺。第2步編譯的時候make只能用于linux中,是不能跨平臺的。

1.5 安裝g++、cmake、make軟件

g++、cmake、make都是軟件,如果要使用,必須先在電腦上進行安裝好。然后添加到環境變量中

sudo yum install gcc gcc-c++
sudo yum install cmake
sudo yum install make

2 linux中第1種g++命令(直接但是復雜,不常用)


1 g++ -o executable_name source_file.cpp  // 編譯普通文件
2 g++ -o your_program your_program.cpp -lgdal  // 編譯帶gdal包的文件,默認從環境變量找頭文件和庫文件。
3 g++ -o your_program your_program.cpp -I/path/to/gdal/include -L/path/to/gdal/lib -lgdal  // -I選項用于指定頭文件路徑,不涉及庫文件,-L選項用于指定庫文件所在的目錄,-l選項用于指定庫文件名。-lgdal指令會去找libgdal.a或者libgdal.so,-L和-l不管是動態庫還是靜態庫都一樣。-l選項后面跟的是庫文件的名稱,不需要包含文件擴展名。
4 g++ -o your_program your_program.cpp -I/path/to/gdal/include -Wl,-rpath,/path/to/gdal/lib -L/path/to/gdal/lib -lgdal  // 防止運行時找不到動態庫文件,編譯程序時使用-Wl,-rpath選項來指定運行時庫文件的搜索路徑。

在這里插入圖片描述

1、編譯時指定運行時的庫文件,有時候在打包時,動態庫本身依賴于其它動態庫,這時候出現找不到的情況,可以使用-Wl,-rpath指定,可以指定多個路徑,用冒號分隔:
g++ -o myapp src/main.cpp -L./lib -lmylib -Wl,-rpath=/path1:/path22、運行c++程序時,找不到動態庫,可以使用export加進來,這樣運行的時候就能找到第3方庫了
export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH
./myapp

3 linux中第2種打包方式cmake命令+make命令(難但是方便,常用)

3.1 編譯的流程

(1)準備好項目代碼;
(2)編寫CMakeLists.txt文件;
(3)創建指定文件夾并用cmake生成構建系統;
(4)make命令進行編譯
(5)運行程序

3.1.1 第1步:準備好項目代碼

在這里插入圖片描述

3.1.2 第2步:編寫CMakeLists.txt文件

在這里插入圖片描述

3.1.3 第3步:創建指定文件夾并用cmake生成構建系統

創建單獨的構建目錄(推薦)進去再使用cmake,不要在根目錄里使用cmake,這里約定俗成就是build目錄,因為cmake會生成很多文件,如果之后重新編譯等可以先把這個目錄直接刪除,而不用每個文件1個個刪除。

# 進入項目目錄
cd my_project# 創建構建目錄(推薦使用out-of-source構建)
mkdir build
cd build# 生成構建系統(根據你的系統選擇生成器)
# 在Linux/macOS上:
cmake ..# 在Windows上(如果使用Visual Studio):
# cmake .. -G "Visual Studio 16 2019"

3.1.4 第4步:編譯項目

# 編譯項目
# 或者在Linux/macOS上也可以直接使用make(如果cmake生成的是Makefile)
make# 也可以用這個命令
cmake --build .

3.1.5 第5步:運行程序

在這里插入圖片描述

3.2 幾個疑問點解釋

3.2.1 為什么要創建build文件夾

在這里插入圖片描述

3.2.2 cmake命令為什么是cmake …

在這里插入圖片描述

3.2.3 cmake …為什么能夠找到上級目錄的CMakeLists.txt文件?并沒有指定CMakeLists.txt文件呀?

CMake 默認會在指定目錄中查找名為 CMakeLists.txt 的文件,這是 CMake 的內置約定,所有 CMake 項目都遵循這一規則。
在這里插入圖片描述
在這里插入圖片描述

3.2.4 cmake具體干了什么?

在這里插入圖片描述

3.3 cmake和make的區別

  • cmake … 只做配置,是一個生成配置的軟件。
    它解析 CMakeLists.txt,檢查環境,生成構建系統文件(如 Makefile),但不會調用編譯器。
  • make 或 cmake --build . 才是編譯
    它們根據生成的構建系統文件,實際調用 g++/clang/msvc 等編譯器生成二進制文件。
  • cmake … 不會直接生成可執行文件,它只是準備構建環境。必須再執行 make 或 cmake --build . 才會真正編譯代碼。使用2步而不是1步主要是因為CMake 的分離配置和編譯的設計哲學。
  • cmake這種設計提高了跨平臺靈活性,也是現代構建系統的通用模式。它會根據

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

3.4 第2種cmake+make打包方法為什么能夠實現跨平臺?實現跨平臺是cmake的功勞還是make的功勞?

  • CMake 是跨平臺靈活性的核心實現者,它通過抽象平臺差異,生成適合當前環境的構建系統。

  • Make 是平臺相關的執行工具,其本身不具備跨平臺能力,依賴 CMake 為它生成平臺適配的 Makefile。

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

3.5 只有在linux中編譯c++代碼才能使用第2種cmake+make打包方法,在windows中 使用CMake + 構建工具(如 Make/Ninja/MSBuild) 的組合

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

4 cmake的1個案例和相關語法

# 設置CMake最低版本要求
cmake_minimum_required(VERSION 3.10)# 定義項目名稱和使用的語言(CXX表示C++)
project(MyProject LANGUAGES CXX)# 設置C++標準為C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 查找OpenCV庫(需要提前安裝)
find_package(OpenCV REQUIRED)# 設置頭文件搜索路徑,使用空格或者換行分割多個路徑
include_directories(${OpenCV_INCLUDE_DIRS}  # OpenCV頭文件路徑include                 # 項目主include目錄include/utils          # 項目子目錄中的頭文件include/core           # 項目子目錄中的頭文件third_party/include    # 第三方庫頭文件
)# 設置動態庫搜索路徑,使用空格或者換行分割多個路徑
link_directories(lib                    # 項目主庫目錄lib/x64               # 項目子目錄中的庫third_party/lib       # 第三方庫目錄${OpenCV_LIBRARY_DIRS} # OpenCV庫路徑
)# 收集所有源文件,遞歸查找
file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*.cc")# 添加可執行文件
add_executable(${PROJECT_NAME} ${SOURCES})# 鏈接庫文件,使用空格或者換行分割多個庫
target_link_libraries(${PROJECT_NAME}${OpenCV_LIBS}        # OpenCV庫utils                 # 項目內部庫core                  # 項目內部庫pthread               # 系統線程庫dl                    # 動態加載庫
)

1、使用cmake進行打包,包含可執行程序和動態依賴庫_cmake 打包-CSDN博客

2、CMake 基本常用語法 CMakeLists.txt_cmakelist語法下載-CSDN博客

3 CMake常用命令_cmake命令-CSDN博客

5 make的相關語法進一步介紹

在這里插入圖片描述

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

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

相關文章

Spark on K8s 在 vivo 大數據平臺的混部實戰與優化

一、Spark on K8s 簡介 (一)定義與架構 Spark on K8s 是一種將 Spark 運行在 Kubernetes(K8s)集群上的架構,由 K8s 直接創建 Driver 和 Executor 的 Pod 來運行 Spark 作業。其架構如下。 Driver Pod:相當于 Spark 集群中的 Driver,負責作業的調度和管理,它會根據作業…

MDA測量數據查看器【內含工具和源碼地址】

一、工具介紹 MDA測量數據查看器用于顯示和分析以MDF格式提供的測量數據。 支持MDF3.3之前含MDF3.3的二進制格式,支持Vector CANape and ETAS Inca. Kvaser CAN Logger (MDF 3.2) 文件。 MDF (Measurement Data Format)是一種二進制文件,用來記錄、交換…

番外篇 | SEAM-YOLO:引入SEAM系列注意力機制,提升遮擋小目標的檢測性能

前言:Hello大家好,我是小哥談。SEAM(Squeeze-and-Excitation Attention Module)系列注意力機制是一種高效的特征增強方法,特別適合處理遮擋和小目標檢測問題。該機制通過建模通道間關系來自適應地重新校準通道特征響應。在遮擋小目標檢測中的應用優勢包括:1)通道注意力增強…

使用VHDL語言實現TXT文件的讀寫操作

使用FPGA進行圖像處理時,通常需要將TXT文件中的圖像數據讀出到TestBench中,并將仿真的結果寫入到TXT文件中,用于確認圖像處理的結果是否正確。 VHDL中TXT文件的讀寫操作如下所示, --------------------------------------------…

基于Redis的4種延時隊列實現方式

延時隊列是一種特殊的消息隊列,它允許消息在指定的時間后被消費。在微服務架構、電商系統和任務調度場景中,延時隊列扮演著關鍵角色。例如,訂單超時自動取消、定時提醒、延時支付等都依賴延時隊列實現。 Redis作為高性能的內存數據庫&#x…

GN ninja 工程化構建例程

文章目錄 1. 前言?2. 工程實例??2.1 工程目錄結構2.2 工程頂層.gn文件2.3 工具鏈配置.gn文件2.4 編譯配置.gn文件2.5 編譯目標配置.gn文件2.6 工程接口文件2.7 動態庫編譯.gn文件2.8 動態庫源文件2.9 靜態庫編譯.gn文件2.10 靜態庫源文件2.11 主程序編譯.gn文件2.12 主程序源…

基于亞博K210開發板——內存卡讀寫文件

開發板 亞博K210開發板 實驗目的 本實驗主要學習 K210 通過 SPI 讀寫內存卡文件的功能 實驗準備 實驗元件 開發板自帶的 TF 卡、LCD 顯示屏 (提前準備好 FAT32 格式的TF 卡。TF 插入 TF 卡槽的時候注意方向,TF 卡的金手指那一面需要面向開發板&am…

51單片機實驗五:A/D和D/A轉換

一、實驗環境與實驗器材 環境:Keli,STC-ISP燒寫軟件,Proteus. 器材:TX-1C單片機(STC89C52RC)、電腦。 二、 實驗內容及實驗步驟 1.A/D轉換 概念:模數轉換是將連續的模擬信號轉換為離散的數字信…

C++ 常用的智能指針

C 智能指針 一、智能指針類型概覽 C 標準庫提供以下智能指針&#xff08;需包含頭文件 <memory>&#xff09;&#xff1a; unique_ptr&#xff1a;獨占所有權&#xff0c;不可復制&#xff0c; 可移動shared_ptr&#xff1a;共享所有權&#xff0c;用于引用計數weak_pt…

6.8.最小生成樹

一.復習&#xff1a; 1.生成樹&#xff1a; 對于一個連通的無向圖&#xff0c;假設圖中有n個頂點&#xff0c;如果能找到一個符合以下要求的子圖&#xff1a; 子圖中包含圖中所有的頂點&#xff0c;同時各個頂點保持連通&#xff0c; 而且子圖的邊的數量只有n-1條&#xff0…

Spring Boot 集成金蝶 API 演示

? Spring Boot 集成金蝶 API 演示&#xff1a;登錄 / 注銷 Cookie 保存 本文將通過 Spring Boot 完整實現一套金蝶接口集成模型&#xff0c;包括&#xff1a; ? 普通登錄? AppSecret 登錄? 注銷? Cookie 保存與復用 &#x1f4c5; 項目結構 src/ ├── controller/ │…

React 受控表單綁定基礎

React 中最常見的幾個需求是&#xff1a; 渲染一組列表綁定點擊事件表單數據與組件狀態之間的綁定 受控表單綁定是理解表單交互的關鍵之一。 &#x1f4cd;什么是受控組件&#xff1f; 在 React 中&#xff0c;所謂“受控組件”&#xff0c;指的是表單元素&#xff08;如 &l…

基于FPGA的AES加解密系統verilog實現,包含testbench和開發板硬件測試

目錄 1.課題概述 2.系統測試效果 3.核心程序與模型 4.系統原理簡介 4.1 字節替換&#xff08;SubBytes&#xff09; 4.2 行移位&#xff08;ShiftRows&#xff09; 4.3 列混合&#xff08;MixColumns&#xff09; 4.4 輪密鑰加&#xff08;AddRoundKey&#xff09; 4.…

6.5 GitHub監控系統實戰:雙通道采集+動態調度打造高效運維體系

GitHub Sentinel Agent 定期更新功能設計與實現 關鍵詞:GitHub API 集成、定時任務調度、Python 爬蟲開發、SMTP 郵件通知、系統穩定性保障 1. GitHub 項目數據獲取功能 1.1 雙通道數據采集架構設計 #mermaid-svg-ZHJIMXcMAyDHVhmV {font-family:"trebuchet ms",v…

Explorer++:輕量級高效文件管理器!!

項目簡介 Explorer 是一款專為Windows操作系統設計的輕量級且高效的文件管理器。作為Windows資源管理器的強大替代方案&#xff0c;它提供了豐富的特性和優化的用戶體驗&#xff0c;使得文件管理和組織變得更加便捷高效。無論是專業用戶還是普通用戶&#xff0c;都能從中受益&a…

7、生命周期:魔法的呼吸節奏——React 19 新版鉤子

一、魔法呼吸的本質 "每個組件都是活體魔法生物&#xff0c;呼吸節奏貫穿其生命始終&#xff0c;"鄧布利多的冥想盆中浮現三維相位圖&#xff0c;"React 19的呼吸式鉤子&#xff0c;讓組件能量流轉如尼可勒梅的煉金術&#xff01;" ——以霍格沃茨魔法生理…

理解計算篇--正則表達式轉NFA--理論部分

空正則表達式轉NFA單字符正則表達式轉NFA拼接正則表達式轉NFA選擇正則表達式轉NFA重復正則表達式轉NFA 正則表達式轉NFA–實戰部分 空正則表達式轉NFA 轉換步驟&#xff1a; 構建1個只有1個狀態的NFA起始狀態也是接受狀態沒有規則&#xff0c;即規則集為空 單字符正則表達式…

穩態模型下的異步電機調速【運動控制系統】

異步電動機&#xff1a; n1是同步轉速&#xff08;電機和磁芯同步時候的轉速&#xff09; n&#xff1a;電機的實際轉速 異步電動機恒壓頻比的概念&#xff0c;為什么基頻以下可以采取恒壓頻率&#xff0c;基頻以上不可以采用恒壓頻比&#xff1a; 異步電動機的恒壓頻比&…

【KWDB 創作者計劃】_算法篇---Stockwell變換

文章目錄 前言一、Stockwell變換原理詳解1.1 連續S變換定義1.2 離散S變換1.3簡介 二、S變換的核心特點2.1頻率自適應的時頻分辨率2.1.1高頻區域2.1.2低頻區域 2.2無交叉項干擾2.3完全可逆2.4相位保持2.5與傅里葉譜的直接關系 三、應用領域3.1地震信號分析3.2生物醫學信號處理3.…