CMake編譯安裝、生成可執行程序、生成靜態動態庫以及靜態動態庫的鏈接

1 CMake介紹

  • CMake是一個開源的、跨平臺的構建系統,用于管理軟件從源代碼到可執行文件的整個構建過程。它最初由Kitware公司為ITK(Insight Segmentation and Registration Toolkit)和VTK(Visualization Toolkit)等開源項目開發,后來成為了一個獨立的開源項目。
  • CMake的設計目標是讓開發者能夠以一種簡單、統一的方式編寫構建規則,這些規則可以在多種操作系統和編譯器環境下工作,從而實現代碼的跨平臺編譯。

2 CMake安裝

  • CMake包下載地址

2.1 Linux平臺安裝

  • 以ubuntu 20.04 版本為例

2.1.1 命令行安裝

  • apt install cmake

2.1.2 源碼編譯安裝

  • 安裝編譯工具和依賴庫
    •   sudo apt install g++sudo apt install makesudo install libssl-dev
      
  • 下載源碼
    • 以3.28.5版本為例,下載這個源碼包 cmake-3.28.5.tar.gz
  • 編譯安裝
    • 解壓后進入cmake源碼目錄,執行以下命令編譯安裝
    •   ./configuire# 編譯make -j4# 默認會安裝到/usr/local/share目錄下make install
      
  • 查看版本
    • 安裝完成后重新打開終端,執行cmake -version就可以看到當前安裝的版本。
    •   cmake version 3.28.5CMake suite maintained and supported by Kitware (kitware.com/cmake).
      
  • 設置環境變量
    • 如果安裝后執行cmake -version看不到版本,可能是環境變量沒有設置進去
    • 打開 ~/.bash_profile 在文件末尾添加以下內容
    •   export PATH=/usr/local/share/cmake-3.28
      

2.2 Windows平臺安裝

  • 下載windows平臺安裝包 cmake-3.28.5-windows-x86_64.msi
  • 下載后直接雙擊安裝
    • 安裝過程中會讓你選擇是否設置環境變量,這里就選擇設置系統環境變量。
    • 在這里插入圖片描述
    • 默認會安裝到 C:\Program Files\CMake目錄下
    • 安裝完成后,打開cmd命令行工具,執行cmake -version就可以看到當前安裝的CMake版本

3 CMake生成可執行程序

  • 文件結構
    •   ├── build├── CMakeLists.txt└── src└── main.cpp
      
  • build目錄: 編譯目錄
  • src目錄: 存放源文件的目錄
  • CMakeLists.txt文件內容
    •   # 指定CMake最低版本cmake_minimum_required(VERSION 3.20)# 構建項目的名稱project(cmake_first_demo)# 構建執行程序# PROJECT_SOURCE_DIR 是CMake的一個系統變量,表示當前工程目錄,即CMake所在目錄add_executable(cmake_first_demo ${PROJECT_SOURCE_DIR}/src/main.cpp)
      

3.1 Windows平臺

  • 構建項目

    •   # 構建項目,在build目錄下執行,此命令會使用默認編譯器構建項目# ..表示上一級目錄cmake ..# 或者通過-G參數,指定編譯器構建項目cmake -G "Visual Studio 14 2015" ..
      
  • 構建項目時指定生成項目文件路徑

    • 上面是手動創建了一個build項目來創建工程,還可以構建項目時自動創建目錄
    • 在 CMakeLists.txt 所在目錄下執行
    •   	# -S 指定CMakeLists.txt 文件所在目錄# -B 指定工程文件生成目錄cmake -S . -B build_x86
      
  • 編譯可執行程序

    • 構建項目成功后,在build目錄下會生成工程文件,可以用Visual Studio 編譯器打開sln后綴的文件。選擇工程,點擊生成,在build/Release目錄下就可以生成可執行程序。

    • 在這里插入圖片描述

    • 在這里插入圖片描述

    • 也可以不用打開編譯器,直接在build目錄下執行以下命令

    •   # 默認生成Debug程序,通過--config可指定生成Release程序cmake --build ./ --config Release
      
    • 在build/Release 目錄下也會生成可執行程序

3.2 Linux平臺

  • CMake支持跨平臺,因此在其Linux平臺也可以直接編譯,和Windows差別不大
  • 構建項目
    •   # 在build目錄下執行cmake ..
      
    • 執行后會在build目錄下生成以下工程文件,工程文件和Windows平臺是不一樣的。
    • 在這里插入圖片描述
  • 編譯可執行程序
    • 直接執行make命令生成可執行程序
    • 在這里插入圖片描述

4 CMake生成靜態庫

  • 文件結構
    •   ├── build├── CMakeLists.txt└── src├── mymath.cpp└── mymath.h
      
  • CMakeLists.txt文件內容
    •   # 指定CMake最低版本cmake_minimum_required(VERSION 3.20)# 構建項目的名稱project(mymath_demo)# 指定頭文件路徑include_directories(${PROJECT_SOURCE_DIR}/src)# 生成庫文件(靜態庫)add_library(mymath_demo STATIC ${PROJECT_SOURCE_DIR}/src/mymath.cpp)
      
  • mymath.h文件內容
    •   #ifndef __MY_MATH_H__#define __MY_MATH_H__int mymath_add(int a, int b);#endif
      
  • mymath.cpp文件內容
    •   #include "mymath.h"int mymath_add(int a, int b){return a + b;}
      

Windows平臺

  • 在build目錄下執行
    •   cmake ..cmake --build . --config Release
      
  • 在build/Release目錄下就會生成靜態庫文件
    • 在這里插入圖片描述

Linux平臺

  • 在build目錄下分別執行以下命令
    •   cmake ..make
      
  • 就會生成對應的靜態庫文件 libmymath_demo.a
    • 在這里插入圖片描述

5 CMake鏈接靜態庫

  • 文件結構
    •   ├── build├── CMakeLists.txt├── mymath│   ├── gcc_x64│   │   └── libmymath_demo.a│   ├── include│   │   └── mymath.h│   └── vc_x86│       └── mymath_demo.lib└── src└── main.cpp
      
  • mymath目錄下的頭文件和庫文件,是在步驟4中編寫和生成的,拷貝過來。
  • CMakeLists.txt文件內容
    •   # 指定CMake最低版本cmake_minimum_required(VERSION 3.20)# 構建項目的名稱project(myproject)# 指定頭文件路徑include_directories(${PROJECT_SOURCE_DIR}/mymath/include)# 指定庫文件路徑IF(WIN32)link_directories(${PROJECT_SOURCE_DIR}/mymath/vc_x86)ELSEIF(UNIX)link_directories(${PROJECT_SOURCE_DIR}/mymath/gcc_x64)ENDIF()# 生成可執行程序add_executable(myproject ${PROJECT_SOURCE_DIR}/src/main.cpp)# 鏈接庫target_link_libraries(myproject mymath_demo)
      
  • main.cpp文件內容
    •   #include <stdio.h>#include "mymath.h"int main(){int sum = mymath_add(10, 20);printf("sum = %d\n", sum);return 0;}
      

Windows平臺

  • build目錄下執行
    •   cmake ..cmake --build . --config Release
      
  • 在build/Release目錄下會生成可執行程序

Linux平臺

  • build目錄下執行
    •   cmake ..make
      
  • 在build目錄下會生成可執行程序

6 CMake生成動態庫

  • 生成動態庫時,使用步驟4中的代碼工程。
  • 將CMakeLists.txt文件最后一行做修改,指定生成動態庫
    •   # 指定CMake最低版本cmake_minimum_required(VERSION 3.20)# 構建項目的名稱project(mymath_demo)# 指定頭文件路徑include_directories(${PROJECT_SOURCE_DIR}/src)# 生成庫文件(動態庫)add_library(mymath_demo SHARED ${PROJECT_SOURCE_DIR}/src/mymath.cpp)
      

Windows平臺

  • 需要注意的是,Windows平臺鏈接動態庫時,需要先找到lib文件
  • 因此對 mymath.h 文件做修改,生成動態庫的同時需要生成lib文件
    •   #ifndef __MY_MATH_H__#define __MY_MATH_H__// 導出接口到lib文件中int __declspec(dllexport) mymath_add(int a, int b);#endif
      
  • build目錄下執行以下命令編譯
    •   cmake ..cmake --build . --config Release
      
  • 會生成lib和dll文件
    • 在這里插入圖片描述

Linux平臺

  • 直接在build目錄下執行命令編譯就可以生成動態庫
    •   cmake ..make
      
  • 生成了動態庫文件
    • 在這里插入圖片描述

7 CMake鏈接動態庫

  • 使用步驟5中的代碼工程
  • 鏈接動態庫時,不用做任何修改,只需要將靜態庫文件替換為動態庫文件即可。
  • 目錄結構如下
    •   ├── build├── CMakeLists.txt├── mymath│   ├── gcc_x64│   │   └── libmymath_demo.so│   ├── include│   │   └── mymath.h│   └── vc_x86│       ├── mymath_demo.dll│       └── mymath_demo.lib└── src└── main.cpp
      

Windows平臺

  • build目錄下執行
    •   cmake ..cmake --build . --config Release
      
  • 在build/Release目錄下會生成可執行程序
  • 運行時需要將 mymath_demo.dll 和可執行程序放到同一個目錄下。

Linux平臺

  • build目錄下執行
    •   cmake ..make
      
  • 在build目錄下會生成可執行程序

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

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

相關文章

在Linux kali下載、安裝Perl環境

目錄 Perl介紹 下載安裝 官網下載 在Windows安裝 在Linux和Mac OS安裝 Perl介紹 Perl一種功能豐富的計算機程序語言&#xff0c;運行在超過100種計算機平臺上&#xff0c;適用廣泛&#xff0c;從最初是為文本處理而開發的&#xff0c;現在用于各種任務&#xff0c;包括系統…

C語言編程數學:探索、挑戰與深度應用

C語言編程數學&#xff1a;探索、挑戰與深度應用 C語言&#xff0c;作為計算機編程的基石之一&#xff0c;不僅廣泛應用于系統級編程&#xff0c;還在數學計算領域發揮著重要作用。本文將圍繞C語言在數學編程中的四個方面、五個方面、六個方面和七個方面展開探討&#xff0c;帶…

面試官:Spring中都應用了哪些設計模式?

設計模式是我們項目中經常會涉及到的項目進行重構、解構時的一種方法。 比如我們常見的單例模式、工廠模式、策略模式、裝飾器模式等都是比較常用的&#xff1b;關于 23 種設計模式&#xff0c;大家可以找本書專門去學習一下&#xff0c;在 Java 框架的源碼中也不例外&#xf…

SRE養成計劃之01-基本命令(持續更新)

基本命令&#xff08;續&#xff09; 軟連接 軟連接 --> 原始文檔 --> 文檔數據格式&#xff1a;ln -s 原始文件或目錄 軟連接文件若原始文件或目錄被刪除&#xff0c;鏈接文件將失效軟連接可存放在不同分分區/文件系統 硬鏈接 硬鏈接 --> 文檔數據格式&#xff1…

如何用python做一個用戶登錄界面——潯川python社

1 需解決的問題&#xff1a; 1.1如何用python做一個用戶登錄界面&#xff1f; 1.2需要用到哪些庫、模塊&#xff1f; 2 問題解決&#xff1a; 2.1 回答 1.1 &#xff1a;合理即可&#xff0c;無標準回答。 2.2 回答 1.2 &#xff1a;tk庫&#xff08;縮寫&#xff09;、GUL界面…

C++20實戰之channel

C20實戰之channel 繼前面兩節的直播&#xff0c;講解了thread、jthread、stop_token、stop_source、stop_callback、cv、cv_any等的用法與底層實現&#xff0c;那么如何基于這些知識實現一個小項目呢&#xff1f; 于是引出了這篇&#xff0c;寫一個channel出來。 注&#xff1a…

【算法】快速冪

算法-快速冪 前置知識 倍增 思路 我們要求 a n a^n an。 簡單的方法是 a n a n ? 1 ? a a^na^{n-1}\cdot a anan?1?a 但是我們不妨使用倍增的思想 若 2 ∣ n 2\mid n 2∣n&#xff0c;則 a n a n 2 2 a^n{a^{\frac n 2}}^2 ana2n?2 若 2 ? n 2\nmid n 2?n&…

【AI】設計師人人必備的Ai課程,AIGC實戰教學

課程介紹 專為設計師定制的AI繪畫視覺課程&#xff0c;包含排版、插畫、海報和動漫等。共43節課程&#xff0c;2.06G視頻&#xff0c;教授AI應用技巧&#xff0c;提高設計效率和質量。內容涵蓋詞生圖方法、AI風格設計等&#xff0c;幫助學員在設計領域取得成就。 1_01-ai課程…

Flutter 中的 SliverPersistentHeader 小部件:全面指南

Flutter 中的 SliverPersistentHeader 小部件&#xff1a;全面指南 Flutter 是一個功能強大的 UI 工具集&#xff0c;用于創建美觀、高性能的移動和 web 應用。在 Flutter 的滾動組件中&#xff0c;SliverPersistentHeader 是一個特殊的組件&#xff0c;它用于在 CustomScroll…

zustand修改一個object對象的嵌套屬性,會觸發更新嗎

在 Zustand 狀態管理庫中&#xff0c;當使用 set 方法來更新一個對象的嵌套屬性時&#xff0c;并不會觸發整個對象的更新操作。相反&#xff0c;Zustand 使用了淺比較來檢測狀態的變化&#xff0c;只有當狀態內部的引用發生變化時&#xff0c;才會觸發更新操作。 因此&#xf…

jrt落地deepin

經過昨天一晚上的努力&#xff0c;把deepin和win10的雙系統安裝好了。同時把jrt開發需要的svn&#xff0c;jdk,idea安裝好里&#xff0c;代碼也checkout里。 首先安裝系統碰到安裝deepin后啟動時候無法選擇win10,在宏偉兄幫助下找到資料執行sudo update-grub解決了。 然后程…

糖果促銷【百度之星】/思維

糖果促銷 思維 大佬的解法&#xff1a; #include<bits/stdc.h> using namespace std; typedef long long ll; int main() {ll t;cin>>t;for(int i0;i<t;i){ll p,k;cin>>p>>k;if(k0) cout<<0<<endl;else{k-(k-1)/p;cout<<k<…

v-for中key的作用

v-for中key的作用 例如我們用v-for渲染一個列表[1, 2, 4 ,5]&#xff0c;然后在中間插入一個3變成[1,2,3,4,5]。v-for寫了key和沒有寫key&#xff0c;Vue是怎么處理的呢&#xff1f; Vue對有key的會調用patchKeyedChildren方法&#xff1b;沒有key的調用patchUnkeyedChildren方…

Vue3 -Computed計算屬性

前言&#xff1a; Computed屬性屬于Vue3中的響應式核心(與之共同說明的還有ref&#xff0c;reactive&#xff0c;watch...) 接受一個 getter 函數&#xff0c;返回一個只讀的響應式 ref 對象。該 ref 通過 .value 暴露 getter 函數的返回值。它也可以接受一個帶有 get 和 set…

AI搜索,圍攻百度

圖片&#xff5c;電影《雙子殺手》截圖 ©自象限原創 作者丨程心 國內的大模型廠商落地C端&#xff0c;都盯上了AI搜索。 隨著5月30號&#xff0c;騰訊宣布推出基于混元大模型的APP“騰訊元寶”&#xff0c;并基于搜狗搜索引擎&#xff0c;上線AI搜索功能。幾乎當下所有…

【Qt】Qt Style Sheets (QSS) 指南:打造個性化用戶界面

文章目錄 前言&#xff1a;1. QSS 選擇器2. 子控件選擇器&#xff08;Sub-Controls&#xff09;2.1. 示例&#xff1a;給 QComboBox 給下拉按鈕加上圖標2.2. 示例&#xff1a;修改進度條顏色 3. 偽類選擇器3.1. 代碼示例: 設置按鈕的偽類樣式.3.2. 代碼示例: 使用事件方式實現同…

數模混合芯片設計中的修調技術是什么?

一、修調目的 數模混合芯片需要修調技術主要是因為以下幾個原因&#xff1a; 工藝偏差&#xff08;Process Variations&#xff09;&#xff1a; 半導體制造過程中存在不可避免的工藝偏差&#xff0c;如晶體管尺寸、閾值電壓、電阻和電容值等&#xff0c;這些參數的實際值與…

阿里云計算之linux入門命令學習筆記(三)

Linux 提供了豐富的命令行工具&#xff0c;用于系統管理、文件操作、網絡管理、進程控制等。以下是一些常用的 Linux 命令及其簡要說明&#xff1a; 切換用戶 su 命令 su (substitute user) 命令用于切換用戶。 su - username # 切換到指定用戶&#xff0c;并加載…

【學習Day5】操作系統

?&#x1f3fb;記錄學習過程中的輸出&#xff0c;堅持每天學習一點點~ ??希望能給大家提供幫助~歡迎點贊&#x1f44d;&#x1f3fb;收藏?評論?&#x1f3fb;指點&#x1f64f; 學習編輯文章的時間不太夠用&#xff0c;先放思維導圖&#xff0c;后續復習完善細節。

【C++】6-6 你好,輸出的格式控制(對齊)

6-6 你好&#xff0c;輸出的格式控制&#xff08;對齊&#xff09; 分數 10 全屏瀏覽 切換布局 作者 向訓文 單位 惠州學院 完善程序&#xff1a;按示例格式輸出所有分數&#xff0c;分數保留2位小數&#xff0c;分數左對齊輸出在兩根豎線之間 裁判測試程序樣例&#xff1…