柚子快報(bào)邀請(qǐng)碼778899分享:c++ cmake 編譯教程
柚子快報(bào)邀請(qǐng)碼778899分享:c++ cmake 編譯教程
參考鏈接:cmake使用詳細(xì)教程(日常使用這一篇就足夠了)_cmake教程-CSDN博客
?一、只有一個(gè)源文件的程序編譯
首先在當(dāng)前目錄下創(chuàng)建兩個(gè)文件
hello.cpp
CMakeLists.txt (注意CMakeLists大小寫(xiě),不要寫(xiě)錯(cuò)了)
cmake_minimum_required (VERSION 2.8)
project (learn_cmake)
add_executable(hello hello.cpp)
第一行意思是cmake最低版本要求2.8,第二行是本項(xiàng)目的工程名第三行:第一個(gè)變量:要生成的可執(zhí)行文件名為hello,后面的參數(shù)是需要的依賴(lài)。
接著在當(dāng)前目錄下執(zhí)行 cmake .?接著會(huì)發(fā)現(xiàn)目錄下多生成了一些文件,例如Makefile,然后使用GNU?make命令來(lái)編譯程序,會(huì)生成可執(zhí)行程序。
二、同一目錄下多個(gè)源文件
此時(shí)在當(dāng)前目錄新增兩個(gè)依賴(lài),并mian函數(shù)的執(zhí)行需要依賴(lài)這兩個(gè)文件
add.cpp
add.h
只需要在CMakeLists.txt中添加所依賴(lài)的.cpp文件,編譯步驟和上面相同。
cmake_minimum_required (VERSION 2.8)
project (learn_cmake)
add_executable(hello hello.cpp myadd.cpp)
三、同一目錄下很多源文件
如果同一目錄下有無(wú)窮多源文件,那么一個(gè)一個(gè)添加就很慢了。此時(shí)可以使用cmake中的函數(shù)存儲(chǔ)這些源文件
aux_source_directory(dir var)
他的作用是把dir目錄中的所有源文件都儲(chǔ)存在var變量中
然后需要用到源文件的地方用 變量var來(lái)取代
此時(shí) CMakeLists.txt 可以這樣優(yōu)化
cmake_minimum_required(VERSION 2.8)
project(learn_cmake)
aux_source_directory(. SRC_LIST)
add_executable(hello ${SRC_LIST})
四、頭文件在別的文件夾
對(duì)于集中的頭文件,CMake提供了一個(gè)很方便的函數(shù)
include_directories ( dir )
他的作用是 自動(dòng)去dir目錄下尋找頭文件,相當(dāng)于 gcc中的?gcc?-I dir
此時(shí)?CMakeLists.txt?可以這樣優(yōu)化
cmake_minimum_required(VERSION 2.8)
project(learn_cmake)
aux_source_directory(. SRC_LIST)
include_directories(./inc_dir)
add_executable(hello ${SRC_LIST})
?五、頭文件源文件分離,并含有多個(gè)文件夾
假如說(shuō)當(dāng)前的工程目錄是這樣的,頭文件和源文件分離,并含有多個(gè)文件夾
此時(shí)?CMakeLists.txt?可以這樣優(yōu)化
cmake_minimum_required(VERSION 2.8)
project(learn_cmake)
aux_source_directory(src_dir1 SRC_LIST1)
aux_source_directory(src_dir2 SRC_LIST2)
aux_source_directory(main_dir MAIN_DIR)
include_directories(./inc_dir1 ./inc_dir2)
add_executable(hello ${SRC_LIST1} ${SRC_LIST2} ${MAIN_DIR})
六、生成動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)
假如說(shuō)當(dāng)前的項(xiàng)目目錄是這樣的
inc目錄下存放頭文件src目錄下存放源文件lib目錄下存放生成的庫(kù)build目錄下存放構(gòu)建項(xiàng)目相關(guān)的文件,如CMakeLists.txt。而稍后我們也在這個(gè)目錄下執(zhí)行cmake和make
?
?此時(shí)?CMakeLists.txt?可以這樣優(yōu)化
cmake_minimum_required(VERSION 2.8)
project(learn_lib)
#整合源文件
aux_source_directory(${PROJECT_BINARY_DIR}/../src SRC_LIST)
#引入頭文件路徑
include_directories(${PROJECT_BINARY_DIR}/../inc)
#生成靜態(tài)庫(kù)或者動(dòng)態(tài)庫(kù) 參數(shù)1:生成的庫(kù)的名稱(chēng) 參數(shù)2:靜態(tài)或動(dòng)態(tài) 參數(shù)3:生成庫(kù)所需要的源文件
add_library(func_shared SHARED ${SRC_LIST})
add_library(func_static STATIC ${SRC_LIST})
#設(shè)置最終生成的庫(kù)的名稱(chēng)
set_target_properties(func_shared PROPERTIES OUTPUT_NAME "myfunc")
set_target_properties(func_static PROPERTIES OUTPUT_NAME "myfunc")
#設(shè)置生成的庫(kù)的路徑
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib)
開(kāi)始編譯:
在build目錄下執(zhí)行 cmake .在build目錄下執(zhí)行 make查看lib目錄下是否生成庫(kù)文件,
出現(xiàn)庫(kù)文件就算編譯成功
七、鏈接庫(kù)文件
庫(kù)文件目錄結(jié)構(gòu)如下:
lib目錄下存放靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)main_src目錄下存放main函數(shù)相關(guān)的源文件bin目錄存放項(xiàng)目生成的可執(zhí)行文件
?此時(shí)?CMakeLists.txt?可以這樣寫(xiě)
cmake_minimum_required(VERSION 2.8)
project(learn_lib)
#整合源文件
aux_source_directory(${PROJECT_BINARY_DIR}/../main_src MAIN_SRC)
#引入頭文件路徑
include_directories(${PROJECT_BINARY_DIR}/../inc)
#生成靜態(tài)庫(kù)或者動(dòng)態(tài)庫(kù) 參數(shù)1:生成的庫(kù)的名稱(chēng) 參數(shù)2:靜態(tài)或動(dòng)態(tài) 參數(shù)3:生成庫(kù)所需要的源文件
add_library(func_shared SHARED ${SRC_LIST})
add_library(func_static STATIC ${SRC_LIST})
#設(shè)置最終生成的庫(kù)的名稱(chēng)
set_target_properties(func_shared PROPERTIES OUTPUT_NAME "myfunc")
set_target_properties(func_static PROPERTIES OUTPUT_NAME "myfunc")
#設(shè)置生成的庫(kù)的路徑
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib)
#查找?guī)煳募?第一個(gè)參數(shù):存儲(chǔ)查找到的庫(kù)文件 第二個(gè)參數(shù):要查找的庫(kù)文件 第三個(gè)參數(shù):要查找的目錄
find_library(FUNC_LIB myfunc ${PROJECT_BINARY_DIR}/../lib)
#設(shè)置可執(zhí)行文件生成到哪里
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../bin)
add_executable(hello ${MAIN_SRC})
target_link_libraries(hello ${FUNC_LIB})
八、如何選擇動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)
選擇生成動(dòng)態(tài)庫(kù)(Dynamic Link Library,DLL 在 Windows 上,Shared Object,.so 在 Unix/Linux 上,或 Dynamic Library,.dylib 在 macOS 上)還是靜態(tài)庫(kù)(Library Archive,.a 或 .lib)主要取決于以下幾個(gè)因素:
動(dòng)態(tài)庫(kù)的優(yōu)點(diǎn):
資源占用:?動(dòng)態(tài)庫(kù)在多個(gè)程序間共享相同的代碼,可以節(jié)省系統(tǒng)內(nèi)存和磁盤(pán)空間,因?yàn)椴恍枰獮槊總€(gè)使用該庫(kù)的應(yīng)用程序復(fù)制整個(gè)庫(kù)。更新方便:?更新動(dòng)態(tài)庫(kù)時(shí),所有依賴(lài)它的應(yīng)用程序都會(huì)自動(dòng)使用新版本,無(wú)需重新編譯或分發(fā)應(yīng)用程序。模塊化:?動(dòng)態(tài)庫(kù)可以更容易地實(shí)現(xiàn)模塊化編程,允許在運(yùn)行時(shí)加載或卸載庫(kù),增強(qiáng)程序的靈活性和擴(kuò)展性。性能:?盡管啟動(dòng)時(shí)可能需要一些額外的時(shí)間來(lái)解析動(dòng)態(tài)庫(kù)中的符號(hào),但在頻繁調(diào)用的情況下,動(dòng)態(tài)鏈接可能會(huì)更快,因?yàn)樗苊饬遂o態(tài)鏈接中的冗余代碼。
靜態(tài)庫(kù)的優(yōu)點(diǎn):
部署簡(jiǎn)單:?使用靜態(tài)庫(kù)的程序是自包含的,不需要在目標(biāo)機(jī)器上存在額外的庫(kù)文件。可靠性:?不會(huì)受到“依賴(lài)地獄”問(wèn)題的影響,即不會(huì)因?yàn)槿鄙賱?dòng)態(tài)庫(kù)或者動(dòng)態(tài)庫(kù)版本不匹配而導(dǎo)致程序崩潰。安全性:?避免了由于動(dòng)態(tài)庫(kù)被惡意替換而導(dǎo)致的安全風(fēng)險(xiǎn)。兼容性:?特別是在嵌入式系統(tǒng)或資源受限的環(huán)境中,靜態(tài)鏈接可以確保軟件的完整性和最小化依賴(lài)。
選擇策略:
如果庫(kù)的使用者需要減少最終可執(zhí)行文件的分發(fā)復(fù)雜度,或者目標(biāo)平臺(tái)資源有限,靜態(tài)庫(kù)可能是更好的選擇。如果庫(kù)需要在多個(gè)應(yīng)用之間共享,或者希望簡(jiǎn)化庫(kù)的更新流程,動(dòng)態(tài)庫(kù)更為合適。
柚子快報(bào)邀請(qǐng)碼778899分享:c++ cmake 編譯教程
好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。