目录
CMake使用
CMake下载
创建系统文件目录
MakeList编写规范
VsCode启动调试
添加配置文件
添加断点,启动调试
CMake使用
CMake下载
输入指令
sudo apt install cmake
安装cmake,使用 cmake -version可查看cmake的版本信息
创建系统文件目录
系统文件目录通常分为bin、include、src、build等
bin主要存放可执行文件
include存放头文件
src存放cpp文件
build存在makelist生成文件
MakeList编写规范
需要配置版本、目录等信息,简单配置如下:
# cmake配置# 1、设置对cmake的最小版本
cmake_minimum_required(VERSION 3.0)# 2、设置工程名
project(apply VERSION 12.0 DESCRIPTION "这是一个项目级别的工程")# 3、指定需要的头文件目录
include_directories(include) # 相对于CMakeLists.txt所在的目录# 4、获取指定目录下的所有cpp文件,用SRC_LIST变量代替
# 如果src目录下的cpp文件很多,在生成可执行文件时一个个写出来十分不便,所以可以使用这个命令方便使用
# aux_source_directory(src SRC_LIST)# 4.1
# aux_source_directory虽然能够很方便的获取所有cpp,但是某些情况下有部分cpp不需要,此时可以使用set命令解决
# 相当于是 ./src/Math.cpp ./src/main.cpp
set(SRC_LIST ./src/Math.cpp./src/main.cpp
)# 5、生成可执行文件,这里的所有cpp文件用变量替代
#executable 可执行的 后面放的是项目的cpp文件
add_executable(app ${SRC_LIST})# 6、设置目标对象(可执行文件)的输出目录。即app可执行文件就会输出到bin目录中
# EXECUTABLE_OUTPUT_PATH是cmake中已定义的变量,表示目标二进制可执行文件的存放位置
# PROJECT_SOURCE_DIR 是工程根目录的变量
# set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
编写总结如下:
# 使用动态库静态库# 设置项目对cmake的最低要求
cmake_minimum_required(VERSION 3.25)# 设置工程名以及版本
project(AppSO VERSION 2.1)# 设置头文件变量,其包含所有需要的头文件。
# 第一个目录是本项目的,第二个是动态库的头文件目录,第三个是静态库头文件目录
set(headers include ../3.29.3/include ../3.29.5/include)# 设置头文件变量到项目中
include_directories(${headers})# 设置编译选项
add_compile_options(-Wall -std=c++11 -g)# 设置资源变量
set(cpps src/program.cpp src/main.cpp)# 生成指定的可执行程序
add_executable(app ${cpps})# 情况一:libtps.so放在/usr/lib目录中
# 找到动态库,这里是已经把libtps.so放到了默认索的路径中
# TPS_LIB_VAR 相当于替换libtps.so
# find_library(TPS_LIB_VAR tps)
# 添加动态库连接相当于g++ -l
# target_link_libraries(app ${TPS_LIB_VAR})# 情况二:是不将动态libtps.so放到指定默认的搜索目录中
# add_library命令创建一个名为tps的目标,表示一个动态库。IMPORTED选项告诉CMake这个目标不是通过源代码编译出来的,而是外部已经编译好的目标。
# 然后使用set_target_properties命令设置tps目标的属性,其中IMPORTED_LOCATION属性指定了动态库文件的路径。
# 最后,target_link_libraries命令将动态库链接到app可执行文件中。命令如下:
# 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/)
# 第二个目录是静态库文件(静态库比较简单,直接写就行)前面是动态库 后面这个目录是静态库
set(libs ${TPS_LIB_VAR_} /home/yoyo/workspaces/cmakes/3.29.5/build/libstps.a)# 连接所有的库
target_link_libraries(app ${libs})# 设置可执行程序的输出目录
set_target_properties(app PROPERTIESRUNTIME_OUTPUT_DIRECTORY "../bin"
)
编写完成后进入到build文件,使用cmake ../指令就会找到Cmakelist.txt文件之后就会将一系列文件生成到build文件夹。使用make生成可执行文件,之后app会生成在bin目录下。
VsCode启动调试
添加配置文件
在运行文件夹中点击添加配置,需要配置launch.json和tasks.json文件。
tasks.json文件配置如下
{"version": "2.0.0","tasks": [{"label": "cmake","type": "shell","command": "cmake","args": ["../"],"options": {"cwd": "${fileDirname}/build"}, },{"label": "make","type": "shell","command": "make","args": [],"options": {"cwd": "${fileDirname}/build"}, },{"label": "build","dependsOn":["cmake", "make"]},],
}
可以看出,上面的 tasks.json 文件主要包含三个命令:
label为cmake的任务:执行shell类型的cmake命令,其参数为 ../,执行时所在的目录为${fileDirname}/build。这个命令等价于在build目录下执行cmake ../
label为make的任务:执行shell类型的make命令,没有参数,执行时所在的目录为${fileDirname}/build。这个命令等价于在build目录下执行make
label为build的任务:该任务由cmake和make任务组成,也就是将上面两条命令执行的过程组合成一个build任务。
之后编写launch.json文件
{"version": "0.2.0","configurations": [{"name": "g++ - Build and debug active file", //配置文件名称 可任意取"type": "cppdbg", //调试类型"request": "launch", //配置文件请求类型"program": "${workspaceFolder}/build/app", //可执行文件的路径和名称 ${workspaceFolder}代表当前的工作目录"args":[], //主函数传入参数"stopAtEntry": false, //设为true时程序将暂停在程序入口处"cwd": "${workspaceFolder}",//运行目录 也就是makelist常在目录"environment": [], //配置依赖的静态库和动态库环境目录"externalConsole": false,"MIMode": "gdb", //使用gdb调试"setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true}],"preLaunchTask": "build", // //调试会话时开始执行的文件,一般为编译文件,与tasks.json的label一致"miDebuggerPath": "/usr/bin/gdb" //调试工具所在位置}]
}
添加断点,启动调试
点击f5之后运行然后进行调试工作即可。