CMake學(xué)習(xí)使用
1、cmake安裝和入門使用
1.1 安裝
sudo apt install cmake # 即可安裝
cmake -version # 查看安裝的cmake版本
1.2 簡(jiǎn)單程序使用cmake
在指定的目錄中作為項(xiàng)目目錄,里面只有一個(gè)Apply.cpp文件。此外為了使用cmake,需要有一個(gè)CMakeLists.txt文件。內(nèi)容如下:
在項(xiàng)目目錄中創(chuàng)建一個(gè)build文件夾,然后進(jìn)入該目錄進(jìn)行命令的操作。如下:
此時(shí),有了Makefile文件,然后可以使用make命令來生成可執(zhí)行程序app,如下:
最后可以使用app來執(zhí)行程序。如果需要?jiǎng)h除app可執(zhí)行文件,可以使用make clean然后app就會(huì)被清理掉,再使用make又可以重新生成。
1.3 總結(jié)三個(gè)cmake命令
# 1、設(shè)置對(duì)cmake的最小版本,這里設(shè)置了要求的最低版本是3.0
cmake_minimum_required(VERSION 3.0)
# 2、設(shè)置工程名為apply,此外還可以設(shè)置工程的版本,以及對(duì)工程的描述。
project(apply VERSION 1.0 DESCRIPTION "這是一個(gè)簡(jiǎn)單的工程")
# 3、生成可執(zhí)行文件
add_executable(app Apply.cpp)
# add_executable(exename source1 source2 ... sourceN)
# 第一個(gè)參數(shù)為可執(zhí)行程序名,后面的是n多個(gè)cpp文件
2、項(xiàng)目級(jí)的組織結(jié)構(gòu)
2.1 項(xiàng)目結(jié)構(gòu)安排
4.0.1目錄是項(xiàng)目目錄,其中include是項(xiàng)目的頭文件,所有頭文件都放在這里面;src是cpp源文件的目錄;build是cmake命令生成的相關(guān)的文件的目錄(Makefile);bin目錄是make命令之后生成的目標(biāo)對(duì)象的存放目錄(可執(zhí)行文件、靜態(tài)庫、動(dòng)態(tài)庫)。CMakeLists.txt文件內(nèi)容如下:
# cmake配置
# 1、設(shè)置對(duì)cmake的最小版本
cmake_minimum_required(VERSION 3.0)
# 2、設(shè)置工程名
project(apply VERSION 12.0 DESCRIPTION "這是一個(gè)項(xiàng)目級(jí)別的工程")
# 3、指定需要的頭文件目錄
include_directories(include) # 相對(duì)于CMakeLists.txt所在的目錄
# 4、獲取指定目錄下的所有cpp文件,用SRC_LIST變量代替
# 如果src目錄下的cpp文件很多,在生成可執(zhí)行文件時(shí)一個(gè)個(gè)寫出來十分不便,所以可以使用這個(gè)命令方便使用
# aux_source_directory(src SRC_LIST)
# 4.1
# aux_source_directory雖然能夠很方便的獲取所有cpp,但是某些情況下有部分cpp不需要,此時(shí)可以使用set命令解決
set(
SRC_LIST
./src/Computer.cpp
./src/Log.cpp
./src/main.cpp
)
# 5、生成可執(zhí)行文件,這里的所有cpp文件用變量替代
add_executable(app ${SRC_LIST})
# 6、設(shè)置目標(biāo)對(duì)象(可執(zhí)行文件)的輸出目錄。即app可執(zhí)行文件就會(huì)輸出到bin目錄中
# EXECUTABLE_OUTPUT_PATH是cmake中已定義的變量,表示目標(biāo)二進(jìn)制可執(zhí)行文件的存放位置
# PROJECT_SOURCE_DIR 是工程根目錄的變量
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
2.2 命令總結(jié)
# 1、設(shè)置變量set(varname value1 value2 ...)
# 設(shè)置cpp文件集合的變量,即通過SRC_LIST替代所有cpp文件
set(SRC_LIST main.cpp foo.cpp bar.cpp)
# 增加編譯選項(xiàng),CMAKE_CXX_FLAGS是cmake系統(tǒng)的變量
set(CMAKE_CXX_FLAGS "-O2 -Wall")
# 2、向工程添加多個(gè)特定的頭文件搜索路徑 --->相當(dāng)于指定g++編譯器的-I參數(shù)
# 語法: include_directories(dir1 dir2 ...)
include_directories(include1 include2 ...)
# 3、aux_source_directory獲取指定目錄下的所有cpp資源文件
aux_source_directory(src SRC_LIST) # 獲取src目錄下的cpp資源文件,將其用變量SRC_LIST替代
# 4、添加編譯選項(xiàng),相當(dāng)于-std=c++11 -g -Wall等
add_compile_options(-Wall -g -std=c++11)
3、靜態(tài)庫和動(dòng)態(tài)庫的生成
3.1 項(xiàng)目結(jié)構(gòu)
# cmake配置
# 1、設(shè)置對(duì)cmake的最小版本
cmake_minimum_required(VERSION 3.0)
# 2、設(shè)置工程名
project(apply VERSION 12.0 DESCRIPTION "這是一個(gè)關(guān)于庫的工程")
# 3、指定需要的頭文件目錄
include_directories(include)
# 4、獲取指定目錄下的所有cpp文件,用SRC_LIST變量代替
aux_source_directory(src SRC_LIST)
# 5、生成靜態(tài)庫文件和動(dòng)態(tài)庫文件,這里的所有cpp文件用變量替代
add_library(kiki_so SHARED ${SRC_LIST})
add_library(kiki_a STATIC ${SRC_LIST})
# 設(shè)置輸出對(duì)象的名稱
set_target_properties (kiki_so PROPERTIES OUTPUT_NAME "kiki")
set_target_properties (kiki_a PROPERTIES OUTPUT_NAME "kiki")
# 6、設(shè)置庫的輸出目錄
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
輸出結(jié)果如下:
3.2 總結(jié)命令
# 1、生成庫文件(包括動(dòng)態(tài)庫和靜態(tài)庫)
add_library(libname [SHARED|STATIC] source1 source2 ... sourceN)
# 2、設(shè)置庫的輸出目錄
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
# EXECUTABLE_OUTPUT_PATH 變量是可執(zhí)行文件的輸出目錄變量
# LIBRARY_OUTPUT_PATH 變量是動(dòng)態(tài)庫靜態(tài)庫的輸出目錄變量
# 3、用于設(shè)置一個(gè)目標(biāo)的屬性。這個(gè)命令通常用于設(shè)置生成的可執(zhí)行文件、靜態(tài)庫或動(dòng)態(tài)庫的一些屬性。
set_target_properties(
<target>
PROPERTIES
<prop1> <value1>
<prop2> <value2>
...
)
# 所以,第一個(gè)target通常是add_libary和add_executable所生成的對(duì)象。OUTPUT_NAME屬性表示輸出的文件名
# 這個(gè)命令通常設(shè)置的屬性有:
* OUTPUT_NAME:指定生成的目標(biāo)的名稱。默認(rèn)情況下,生成的目標(biāo)的名稱與目標(biāo)的名稱相同,但是可以通過 OUTPUT_NAME 屬性來自定義名稱。
* LIBRARY_OUTPUT_DIRECTORY:指定生成的動(dòng)態(tài)庫的輸出目錄。默認(rèn)情況下,生成的動(dòng)態(tài)庫將被放置在構(gòu)建目錄下,但是可以通過 LIBRARY_OUTPUT_DIRECTORY 屬性來自定義輸出目錄。
設(shè)置這個(gè)屬性類似于set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)的效果,但是這個(gè)會(huì)將所有目標(biāo)都輸出到指定的目錄中;如果通過這個(gè)屬性設(shè)置,可以設(shè)置指定的目標(biāo)到指定的目錄中。如上面的兩個(gè)庫,可以將其中一個(gè)動(dòng)態(tài)庫對(duì)象輸出到其他目錄中。不可以輸出改變靜態(tài)庫的輸出目錄。
* ARCHIVE_OUTPUT_DIRECTORY:指定生成的靜態(tài)庫的輸出目錄。同LIBRARY_OUTPUT_DIRECTORY屬性的功能。
* RUNTIME_OUTPUT_DIRECTORY:指定生成的可執(zhí)行文件的輸出目錄。set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)功能類似。
4、使用靜態(tài)庫和動(dòng)態(tài)庫
4.1 項(xiàng)目結(jié)構(gòu)
# 使用動(dòng)態(tài)庫靜態(tài)庫
# 設(shè)置項(xiàng)目對(duì)cmake的最低要求
cmake_minimum_required(VERSION 3.25)
# 設(shè)置工程名以及版本
project(AppSO VERSION 2.1)
# 設(shè)置頭文件變量,其包含所有需要的頭文件。
# 第一個(gè)目錄是本項(xiàng)目的,第二個(gè)是動(dòng)態(tài)庫的頭文件目錄,第三個(gè)是靜態(tài)庫頭文件目錄
set(headers include ../3.29.3/include ../3.29.5/include)
# 設(shè)置頭文件變量到項(xiàng)目中
include_directories(${headers})
# 設(shè)置編譯選項(xiàng)
add_compile_options(-Wall -std=c++11 -g)
# 設(shè)置資源變量
set(cpps src/program.cpp src/main.cpp)
# 生成指定的可執(zhí)行程序
add_executable(apply ${cpps})
# 情況一:libtps.so放在/usr/lib目錄中
# 找到動(dòng)態(tài)庫,這里是已經(jīng)把libtps.so放到了默認(rèn)索的路徑中
# find_library(TPS_LIB_VAR tps)
# 添加動(dòng)態(tài)庫連接相當(dāng)于g++ -l
# target_link_libraries(app ${TPS_LIB_VAR})
# 情況二:是不將動(dòng)態(tài)libtps.so放到指定默認(rèn)的搜索目錄中
# add_library命令創(chuàng)建一個(gè)名為tps的目標(biāo),表示一個(gè)動(dòng)態(tài)庫。IMPORTED選項(xiàng)告訴CMake這個(gè)目標(biāo)不是通過源代碼編譯出來的,而是外部已經(jīng)編譯好的目標(biāo)。
# 然后使用set_target_properties命令設(shè)置tps目標(biāo)的屬性,其中IMPORTED_LOCATION屬性指定了動(dòng)態(tài)庫文件的路徑。
# 最后,target_link_libraries命令將動(dòng)態(tài)庫鏈接到app可執(zhí)行文件中。命令如下:
# add_library(tps_obj SHARED IMPORTED)
# set_target_properties(tps_obj PROPERTIES IMPORTED_LOCATION /home/yoyo/workspaces/cmakes/3.29.3/build/libtps.so)
# target_link_libraries(app tps_obj)
# 情況三:與情況二相同,只是操作方式不同
find_library(TPS_LIB_VAR_ tps HINTS /home/yoyo/workspaces/cmakes/3.29.3/build/)
# 第二個(gè)目錄是靜態(tài)庫文件(靜態(tài)庫比較簡(jiǎn)單,直接寫就行)
set(libs ${TPS_LIB_VAR_} /home/yoyo/workspaces/cmakes/3.29.5/build/libstps.a)
# 連接所有的庫
target_link_libraries(apply ${libs})
# 設(shè)置可執(zhí)行程序的輸出目錄
set_target_properties(apply PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "../bin"
)
4.2 總結(jié)命令
# 1、find_library: 在指定目錄下查找指定庫,并把庫的絕對(duì)路徑存放到變量里,其第一個(gè)參數(shù)是變量名稱,第二個(gè)參數(shù)是庫名稱,第三個(gè)參數(shù)是HINTS,第4個(gè)參數(shù)是路徑。表示在指定的目錄下找對(duì)應(yīng)庫名稱的庫,用第一個(gè)參數(shù)變量名稱保存。如果不寫第三個(gè)和第四個(gè)參數(shù)就默認(rèn)在系統(tǒng)默認(rèn)的目錄中搜索庫。
# 2、target_link_libraries:鏈接庫,第一個(gè)參數(shù)是可執(zhí)行程序目標(biāo)對(duì)象,第二個(gè)參數(shù)是庫。
VSCode調(diào)試運(yùn)行
VSCode調(diào)試配置
文章來源:http://www.zghlxwxcb.cn/news/detail-779660.html
#### launch.json文件配置
{
// 使用 IntelliSense 了解相關(guān)屬性。
// 懸停以查看現(xiàn)有屬性的描述。
// 欲了解更多信息,請(qǐng)?jiān)L問: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++ - 生成和調(diào)試活動(dòng)文件",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/bin/apply", ### 配置可執(zhí)行文件
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"preLaunchTask": "Build", ### 還需要配置任務(wù)json文件,配置這個(gè)可以避免修改源碼之后需要手動(dòng)make重新生成。這個(gè)Build是task.json文件中一個(gè)label
}
]
}
#### tasks.json文件配置
{
"version": "2.0.0",
"options": {
"cwd": "${workspaceFolder}/build"
},
"tasks": [
{
"type": "shell",
"label": "cmake",
"command": "cmake",
"args": [
".."
]
},
{
"label": "make",
"group": {
"kind": "build",
"isDefault": true
},
"command": "make",
"args": []
},
{
"label": "Build", ### launch.json中選擇了這個(gè)
"dependsOrder": "sequence",
"dependsOn": [
"cmake",
"make"
]
}
]
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-779660.html
到了這里,關(guān)于CMake快速使用+VSCode開發(fā)(調(diào)試)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!