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