CMakeLists.txt學習

一:

#是行注釋 ,[[ 塊注釋 ]]

0.cmake_minimum_required:? 指定使用的cmake的最低版本

1.project()? 定義工程名稱

并可以指定工程的版本,工程描述,web主頁地址,支持的語言(默認情況支持所有語言)

2.add_executable(可執行程序名 源文件)? 源文件可以為多個,可以使用空格或分號間隔

例子 add_executable(app add.c div.c main.c)? ??add_executable(app add.c;div.c;main.c)??

CMakeLists.txt例子

#cmake本地最小版本要求3.0.9
cmake_minimum_required(VERSION 3.0.9)
#工程名稱為test
project(test)
#根據源文件生成可執行文件
add_executable(app add.cpp div.cpp mult.cpp main.cpp sub.cpp)

執行命令

#cmake 后面跟上CMakeLists.txt的路徑
#CMakeLists.txt在當前路徑
cmake ./

cmake執行后,會多出來一些文件,生成的文件在主目錄中會讓文件結構較為混亂

CMakeCache.txt   #生成的
CMakeFile #生成的文件
app  #生成的可執行文件
cmake_install.cmake   #
Makefile  #生成的

在linux系統下,在CMakeLists.txt所在目錄touch/mkdir創建一個build文件,進入其中,執行

cmake ../
#就會生成上面哪些文件在build中,在此目錄生成了makefile,執行make
make  #就會執行可執行文件

通過這種方式可以生成一個簡單項目的構建,如果這個項目里面文件特別多的情況下,是沒有辦法通過這種方式構建的,cmake提供了文件搜索命令解決這種問題

在CMakeLists.txt所在目錄要刪除執行cmake命令生成的文件,重新執行cmake才會讓哪些文件生成在build文件中,然后在build文件目錄下執行make命令才會生成可執行文件

二:add_executable(可執行文件 源文件),SET用法

可以在cmake中定義變量

set(string字符串)? cmake里面set命令里面一切皆為字符串

#VAR是變量名   VALUE是變量值
set(VAR VALUE)
例子:
#相當于變量值所有會存儲在變量名里面,相當于對這個變量做了初始化
set(exe add.c;div.c;main.c;sub.c)
#根據初始化的變量,也就是定義的源文件生成可執行文件
#${變量名}  通過這種方式才能取變量的值
add_excutable(app ${exe})

C++標準,在編寫C++程序時候,可能會用到C++11,C++14,C++17,C++20等新特性,那么就需要在編譯的時候指定出要使用那個標準

1.在CMakeLists.txt通過set命令指定一個固定的宏的值

#添加-std=c++11
set(CMAKE_CXX_STANDARD 11)  #使用C++11的標準
#添加-std=C++14   CMAKE_CXX_STANDARD是一個標準宏,用于指定標準
set(CMAKE_CXX_STANDARD 14)

2.在執行cmake命令的時候指定出這個宏的值

#增加-std=c++11,運行這個命令會生成一個makefile,指定的標準就會生成在這個makefile文件里面去了
# -D的作用是指定宏的值
cmake CMakeLists.txt文件路徑 -DCMAKE_CXX_STANDARD=11
#同樣

3.在CMake中指定可執行程序指定輸出的路徑,也對應一個宏,叫做EXCUTABLE_OUTPUT_PATH,它的值也是通過set()命令進行設置

set(HOME /home/robin/Linux/Sort)
#指定生成可執行文件的路徑,最好為絕對路徑,這樣項目地址更改后生成的可執行文件絕對地址不變
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)

三.搜索文件 、

set(變量名 變量值)

?add_executable(可執行文件 源文件)

生成可執行文件時候,當源文件較多的時候,就要用到cmake提供的aux_source_dirctory命令查找某個路徑下的所有源文件,命令格式為

方式1.aux_source_dirctory(<div> <variable>)? <div>要搜索的目錄? <variable>:將從dir目錄下搜索到的源文件列表存儲到該變量中

#將
aux_source_directory(<目錄> <variable>)
#上條命令將目錄下的源文件搜索到變量中
#使用以下命令生成可執行文件通過源文件搜索到變量
add_executable(app ${variable})#宏PROJECT_SOURCE_DIR是CMakeLists.txt所在目錄
aux_source_directory(${PROJECT_SOURCE_DIR} SRC)
#將SRC變量搜索到的文件作為源文件生成app
add_executable(app ${SRC})

方式2.?如果一個項目中源文件過多,在編寫CMakeLists.txt文件的時候不可能將項目中目錄的各個文件一一羅列出來,所以在cmake中我們提供了搜索文件的命令,就是file,當然除了搜索外。file也可以做其他事情

file(GLOB/GLOB_RECURSE 變量名 要搜索的文件路徑和文件類型)

GLOB:將指定目錄下搜索到的滿足條件的所有文件名生成一個列表,并將其存儲到變量中

GLOB_RECURSE:遞歸搜索指定目錄,將搜索到的滿足條件的文件名生成一個列表,并將其存儲到變量中。

#將目錄下的.c或.h文件搜集到變量中
#file(GLOB/GLOB_RECURSE 變量名 要搜索的文件路徑和文件類型)
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
file(GLOB MAIN_HEAD ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)

在完整CMakeLists.txt中file用法

cmake_mimimum_required(VERSION x.x.x)
project(test)
#使用以下命令通過源文件搜索到變量
#aux_source_directory(${PROJECT_SOURCE_DIR} SRC)
file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
set(EXECUTABLE_OUTPUT_PATH /home/xx/xx/xx)
#通過file文件搜索到的CMakeLists.txt所在目錄下所有文件作為源文件
add_executable(app ${SRC})

指定頭文件路徑命令

#PROJECT_SOURCE_DIR這個宏是CMakeLists.txt所在目錄下的,它下面的include文件就是頭文件路徑,按實際情況而定
#指定存儲頭文件所在的目錄
include_directories(${PROJECT_SOURCE_DIR}/include)

四.通過cmake制定庫文件

1.靜態庫和動態庫

add_library(庫名稱 STATIC 源文件1 【源文件2】 ...)

add_library(庫名稱 SHARED 源文件1 【源文件2】 ...)? ?生成動態庫 ,庫名稱

在linux中,靜態庫名字分為三部分:lib+庫名字+.a,此處只需要指定出庫的名字就可以了,另外兩部分在生成該文件的時候會自動填充

.名字組成為: lib+xxx+.a? xxx是名字, 如果是動態庫,.a后綴在linux中是so,在windows里面是dll

.如果是靜態庫 :lib+xxx+ .lib(windows系統中)? 如果是linux系統后綴是.a

動態庫和靜態庫都由三部分組成

#動態庫的制作,將SRC對應文件制作為動態庫calc.so 或者calc.dll(windows下)
add_library(calc SHARED ${SRC})
#cmake會生成calc.so,動態庫是具有可執行權限的
#靜態庫則為
add_library(calc STATIC ${SRC})
#靜態庫命令執行后會生成calc.a 但是不具有可執行權限

庫文件的制作本質是將源代碼的文本形式轉換為二進制形式

2.指定庫生成路徑

使用宏LIBRARY_OUTPUT_PATH?

#指定庫文件生成路徑,如果沒有這個路徑,生成庫文件之前會生成這個路徑
set(LIBRARY_OUTPUT_PATH /home/xx/xx/xx)
add_library(calc STATIC ${SRC})
#執行cmake命令則會生成calc.a靜態庫文件在/home/xx/xx/xx路徑下
add_library(calc SHARED ${SRC})
#執行cmake命令會將SRC源文件生成calc.so動態庫文件在同樣目錄下

五.在程序中鏈接靜態庫文件

測試生成的動態庫或靜態庫能不能用

首先,我們要把制作出的庫文件發布出去,然后就是打包頭文件,因為頭文件里面有庫文件里面一系列函數的聲明。

#將靜態庫和動態庫放置在不同庫目錄下

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

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

相關文章

Pytorch-04 搭建神經網絡架構工作流

搭建神經網絡架構 在pytorch中&#xff0c;神經網絡被抽象成由一系列對數據執行特定操作的層或者模塊組成&#xff0c;比如下面的Attention實現&#xff0c;每個塊都是一個模塊或者層。 如果你想快速搭建網絡架構&#xff0c;torch.nn這個命名空間提供了所有很多開箱即用的層…

從“碎片化”到“完美重組”:IP報文的分片藝術

前言 在網絡通信中&#xff0c;當IP層需要傳輸的數據包大小超過數據鏈路層的MTU限制時&#xff0c;就必須進行分片處理。本文將完整解析IP分片的工作機制&#xff0c;包括分片字段的作用、如何減少分片&#xff0c;以及分片報文的組裝原理。 IP報頭解析請參考&#xff…

[GESP202306 四級] 2023年6月GESP C++四級上機題超詳細題解,附帶講解視頻!

本文為2023年6月GESP C四級的上機題目的詳細題解&#xff01;覺得寫的不錯或者有幫助可以點個贊啦! &#xff08;第一次講解視頻&#xff0c;有問題可以指出&#xff0c;不足之處也可以指出&#xff09; 目錄 題目一講解視頻: 題目二講解視頻: 題目一: 幸運數 題目大意: …

內網穿透 FRP 配置指南

關鍵詞&#xff1a;內網穿透、FRP配置、frps、frpc、遠程訪問、自建服務器、反向代理、TCP轉發、HTTP轉發 在開發或部署項目時&#xff0c;我們經常遇到內網設備無法被公網訪問的問題&#xff0c;例如你想從外網訪問你家里的 NAS、遠程調試開發板&#xff0c;或是訪問本地測試環…

SpringBoot 信用卡檢測、OpenAI gym、OCR結合、DICOM圖形處理、知識圖譜、農業害蟲識別實戰

信用卡欺詐檢測通常使用公開數據集 數據準備與預處理 信用卡欺詐檢測通常使用公開數據集如Kaggle的信用卡交易數據集。數據預處理包括處理缺失值、標準化數值特征、處理類別特征。在Spring Boot中,可以使用pandas或sklearn進行數據預處理。 // 示例:使用Spring Boot讀取CS…

使用 Docker 部署 Golang 程序

Docker 是部署 Golang 應用程序的絕佳方式,它可以確保環境一致性并簡化部署流程。以下是完整的指南: 1. 準備 Golang 應用程序 首先確保你的 Go 應用程序可以正常構建和運行。一個簡單的示例 main.go: package mainimport ("fmt""net/http" )func ha…

從零開始的CAD|CAE開發: LBM源碼實現分享

起因:上期我們寫了流體仿真的經典案例: 通過LBM,模擬計算渦流的形成,當時承諾: 只要驗證通過,就把代碼開源出來;ok.驗證通過了,那么我也就將代碼全都貼出來代碼開源并貼出:public class LidDrivenCavityFlow : IDisposable{public LidDrivenCavityFlow(int width 200, int hei…

倉庫管理系統-17-前端之物品類型管理

文章目錄 1 表設計(goodstype) 2 后端代碼 2.1 Goodstype.java 2.2 GoodstypeMapper.java 2.3 GoodstypeService.java 2.4 GoodstypeServiceImpl.java 2.5 GoodstypeController.java 3 前端代碼 3.1 goodstype/GoodstypeManage.vue 3.2 添加菜單 3.3 頁面顯示 1、goodstype表設…

共識算法深度解析:PoS/DPoS/PBFT對比與Python實現

目錄 共識算法深度解析:PoS/DPoS/PBFT對比與Python實現 1. 引言:區塊鏈共識的核心挑戰 2. 共識算法基礎 2.1 核心設計維度 2.2 關鍵評估指標 3. PoS(權益證明)原理與實現 3.1 核心機制 3.2 Python實現 4. DPoS(委托權益證明)原理與實現 4.1 核心機制 4.2 Python實現 5. P…

3.JVM,JRE和JDK的關系是什么

3.JVM&#xff0c;JRE和JDK的關系是什么 1.JDK&#xff08;Java Development Kit&#xff09;&#xff0c;是功能齊全的Java SDK&#xff0c;包含JRE和一些開發工具&#xff08;比如java.exe,運行工具javac.exe編譯工具&#xff0c;生成.class文件&#xff0c;javaw.exe,大多用…

深度學習技術發展思考筆記 || 一項新技術的出現,往往是為了解決先前范式中所暴露出的特定局限

深度學習領域的技術演進&#xff0c;遵循著一個以問題為導向的迭代規律。一項新技術的出現&#xff0c;往往是為了解決先前范式中所暴露出的特定局限。若將這些新技術看作是針對某個問題的“解決方案”&#xff0c;便能勾勒出一條清晰的技術發展脈絡。 例如&#xff0c;傳統的前…

Promise的reject處理: then的第二個回調 與 catch回調 筆記250804

Promise的reject處理: then的第二個回調 與 catch回調 筆記250804 Promise 錯誤處理深度解析&#xff1a;then 的第二個回調 vs catch 在 JavaScript 的 Promise 鏈式調用中&#xff0c;錯誤處理有兩種主要方式&#xff1a;.then() 的第二個回調函數和 .catch() 方法。這兩種方…

Maven模塊化開發與設計筆記

1. 模塊化開發模塊化開發是將大型應用程序拆分成多個小模塊的過程&#xff0c;每個模塊負責不同的功能。這有助于降低系統復雜性&#xff0c;提高代碼的可維護性和可擴展性。2. 聚合模塊聚合模塊&#xff08;父模塊&#xff09;用于組織和管理多個子模塊。它定義了項目的全局配…

sqli-labs:Less-21關卡詳細解析

1. 思路&#x1f680; 本關的SQL語句為&#xff1a; $sql"SELECT * FROM users WHERE username($cookee) LIMIT 0,1";注入類型&#xff1a;字符串型&#xff08;單引號、括號包裹&#xff09;、GET操作提示&#xff1a;參數需以)閉合關鍵參數&#xff1a;cookee p…

大模型+垂直場景:技術縱深、場景適配與合規治理全景圖

大模型垂直場景&#xff1a;技術縱深、場景適配與合規治理全景圖??核心結論?&#xff1a;2025年大模型落地已進入“深水區”&#xff0c;技術價值需通過 ?領域縱深&#xff08;Domain-Deep&#xff09;?、數據閉環&#xff08;Data-Driven&#xff09;?、部署友好&#x…

Kotlin Daemon 簡介

Kotlin Daemon 是 Kotlin 編譯器的一個后臺進程&#xff0c;旨在提高編譯性能。它通過保持編譯環境的狀態來減少每次編譯所需的啟動時間&#xff0c;從而加快增量編譯的速度。 Kotlin Daemon 的主要功能增量編譯&#xff1a; 只編譯自上次編譯以來發生更改的文件&#xff0c;節…

鴻蒙南向開發 編寫一個簡單子系統

文章目錄 前言給設備&#xff0c;編寫一個簡單子系統總結 一、前言 對于應用層的開發&#xff0c;搞了十幾年&#xff0c;其實已經有點開發膩的感覺了&#xff0c;翻來覆去&#xff0c;就是調用api&#xff0c;頁面實現&#xff0c;最多就再加個性能優化&#xff0c;但對底層…

超詳細:2026年博士申請時間線

博士申請是一場持久戰&#xff0c;需要提前規劃。那么&#xff0c;如何科學安排2026年博士申請時間線&#xff1f;SCI論文發表的最佳時間節點是什么&#xff1f;今天給所有打算申博的同學們&#xff0c;詳細解析下&#xff0c;每個時間節點的重點內容。2025年4月&#xff1a;是…

Python爬蟲實戰:研究tproxy代理工具,構建電商數據采集系統

1. 引言 1.1 研究背景 在大數據與人工智能技術快速發展的背景下,網絡數據已成為企業決策、學術研究、輿情監控的核心資源。據 Statista 統計,2024 年全球互聯網數據總量突破 180ZB,其中 80% 為非結構化數據,需通過爬蟲技術提取與轉化。Python 憑借其簡潔語法與豐富的爬蟲…

HighgoDB查詢慢SQL和阻塞SQL

文章目錄環境文檔用途詳細信息環境 系統平臺&#xff1a;N/A 版本&#xff1a;6.0,5.6.5,5.6.4,5.6.3,5.6.1,4.5.2,4.5,4.3.4.9,4.3.4.8,4.3.4.7,4.3.4.6,4.3.4.5,4.3.4.4,4.3.4.3,4.3.4.2,4.3.4,4.7.8,4.7.7,4.7.6,4.7.5,4.3.2 文檔用途 本文介紹了如何對數據庫日志進行分析…