基于VS Code和CMake实现C/C++开发

news/2024/7/16 7:47:54 标签: ide, c++, vscode

基于VS Code和CMake实现C/C++开发

参考链接: link

一、 CMake到底是什么东西?

CMake是一个跨平台的编译工具,可以用简单的语句描述所有平台的安装。CMake已经成为大部分C++开源项目标配。
比如要在原始文件中新建一个bar.cpp文件,如果不使用CMake的话,在不同的平台需要分别进行添加编译,做不同的修改;而如果使用CMake的话,只需要在CMakeLists.txt中进行添加,然后使用CMake即可。
请添加图片描述
(不使用CMake时添加一个文件的修改和编译过程)
请添加图片描述
(使用CMake时添加一个文件的修改和编译过程)

二、语法特性介绍

基本语法格式:指令(参数1 参数2 参数3…)
1.参数使用括弧括起来
2.参数之间使用空格或者分号分开,,一般习惯用空格,切记不能用逗号
3.指令大小写无关,参数和变量是大小写有关的

//set的意思是建立一个变量HELLO, HELLO的值是hello.cpp
set(HELLO hello.cpp)
add_executable(hello main.cpp hello.cpp)
//变量使用${}的方式取值,但是在IF控制语句中是直接使用变量名,例如if(HELLO);写成if(${HELLO})就是错误的方式
ADD_EXECUTABLE(hello main.cpp ${HELLO})

三、重要指令和 CMake常用变量

3.1 重要指令

1.cmake_minimum_required—指定CMake的最小版本需求,一般在写CMakeLists.txt时在第一行就将该语句加上,其中[FATAL_ERROR]为可选项,是当版本不符合要求时报什么样的错误。
语法:cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])

#CMake最小版本要求为2.8.3
cmake_minimum_required(VERSION 2.8.3)

2.project —定义工程名称,并可指定工程支持的语言
语法: project(projectname [CXX][C][Java])

project(HELLOWORLD)

3.set—显示的定义变量
语法:set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

//定义SRC变量,其值为main.cpp hello.cpp
//可以一个变量代表好几个文件
set(SRC main.cpp hello.cpp)

4.include_directories向工程添加多个特定的头文件搜索路径—>相当于指定g++编译器的 -I 参数
语法:include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)

//将/usr/include/muincludefolder 和 ./include 添加到文件搜索路径中
//比如下面这个例子:添加了一个绝对路径,添加了一个相对路径,都只添加到头文件所在的文件夹
include_directories(/usr/include/myincludefolder ./include)

5.link_directories向工程中添加多个特定的库文件搜索路径—>相当于指定g++编译器的-L参数
语法:link_directories(dir1 dir2 …)

//将/usr/lib/myfolder和./lib添加到库文件搜索路径
link_directories(/usr/lib/mufolder ./lib)

6.add_library生成库文件(重要)
语法:add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN),其中STATIC对应静态库.a文件,SHARED对应动态库.so文件

//通过变量 SRC 生成 libhello.so 共享库
add_library(hello SHARED ${SRC})

7.add_cmpile_options—添加编译参数
语法:add_compile_options( …)

//添加编译参数 -Wall(代表输出所有警告信息) -std=c++11 -o2(代表编译器优化选项)
add_compile_options(-Wall -std=c++11)

8.add_executable—生成可执行文件
语法:add_executable(exename source1 source2 … sourceN)

//编译main.cpp生成可执行文件main
//相当于 g++ main.cpp -o main
add_executable(main main.cpp)

9.target_link_libraries—为target添加需要链接的共享库—>相当于指定g++中的编译器-l(小写的-L)参数
语法:target_link_libraries(target library1<debug | optimized> library2…)

//在指令6示例中生成了一个hello的动态链接库,在指令8的示例中生成了一个main的可执行文件
//下面将hello链接库链接到main可执行文件中
target_link_libraries(main hello)

10.add_subdirectory—向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
语法:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

//添加src子目录,src中需有一个CMakeLists.txt
add_subdirectory(src)

11.aux_source_directory—发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表
语法:aux_source_directory(dir VARIABLE)

//定义SRC变量,其值为当前目录下所有的源代码文件
aux_source_directory(. SRC)
//编译SRC变量所代表的源代码文件,生成main可执行文件
add_executable(main ${SRC}$)

3.2 CMake常用变量

1.CMAKE_C_FLAGS gcc编译选项
2.CMAKE_CXX_FLAGS g++编译选项

//在CMAKE_CXX_FLAGS编译选项后追加-std=c++11
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

3.CMAKE_BUILD_TYPE 设置编译类型(Debug, Release)(重要)

//设定编译类型为debug,调试时需要选择debug
set(CMAKE_BUILD_TYPE Debug)
//设定编译类型为Release, 发布时需要选择reaease
set(CMAKE_BUILD_TYPE Release)

4.CMAKE_C_COMPILER:指定C编译器
5.CMAKE_CXX_COMPILER:指定C++编译器
6.EXECUTABLE_OUTPUT_PATH:可执行文件输出的存放路径
7.LIBRARY_OUTPUT_PATH:库文件输出的存放路径

四、CMake编译工具

CMake目录结构:项目主目录存在一个CMakeLists.txt文件
两种方式设置编译规则:
1.包含源文件的子文件夹CMakeLists.txt文件,主目录的CMakeList.txt通过add_subdirectory添加子目录即可;
2.包含源文件的子文件夹未包含CMakeLists.txt文件,子目录编译规则体现在主目录的CMakeLists.txt中
(后面6.5小节实战演练这两个到底是什么含义)

4.1 在linux平台下编译CMake构建C/C++的流程:

1.手动编写CMakeLists.txt
2.执行命令cmake PATH生成Makefile(PATH为顶层CMakeLists.txt所在的目录)
3.执行命令make进行编译

4.2 两种构建方法

内部构建(in-source build):不推荐使用
内部构建会在同级目录下产生一大堆中间文件,这些中间文件并不是最终所需要的,和工程源文件放在一起会显得杂乱无章。

//在当前目录下,编译本目录的CMakeLists.txt,生成Makefile文件
cmake. 
//执行make指令,生成target
make

外部构建(out-of-source build):(推荐使用)
将编译输出文件与源文件放到不同目录中:

//在当前目录下,创建build文件夹
mkdir build
//2.进入build文件夹
cd build
//3.编译上级目录的CMakeLists.txt,生成Makefile和其他文件
cmake ..
//4.执行make指令,生成target
make

五、CMake代码实践

本节首先在 link 中编写的两个小工程上做实验。

vscode_160">5.1 首先在第一个小工程文件夹中,通过终端输入 code . 打开 vscode

首先在该文件顶层目录下新建一个 CMakeLists.txt 文件,编写

#指定cmake最低版本
cmake_minimum_required(VERSION 3.0)
#一般用大写指定项目名称
project(HELLOWORLD)
#生成可执行文件helloworld_cmake
add_executable(helloworld_cmake helloworld.cpp)

保存,然后执行:

mkdir build
cd build
cmake ..
make

编译完成后生成可执行文件,运行./hello_cmake即可。

vscode_180">5.1 首先在第二个小工程文件夹中,通过终端输入 code . 打开 vscode

首先在该文件顶层目录下新建一个 CMakeLists.txt 文件,编写

cmake_minimum_required(VERSION 3.0)
project(SWAP)
#添加头文件搜索目录,相对于CMakeLists.txt的相对路径
include_directories(include)

add_executable(main_cmake main.cpp src/swap.cpp)

保存,然后执行:

mkdir build
cd build
cmake ..
make

编译完成后生成可执行文件,运行./main_cmake即可。


http://www.niftyadmin.cn/n/883741.html

相关文章

使用VS Code进行完整项目开发

使用VS Code进行完整项目开发 参考链接: link 一、合理设置项目目录 案例&#xff1a;士兵突击 需求&#xff1a; 1.士兵有一把枪 2.士兵可以开火 3.士兵可以给枪装填子弹 4.枪能够发射子弹 5.枪能够装填子弹—“增加子弹数量” 开发&#xff1a; 开发枪类 开发士兵类 提取到…

用 VS Code 调试C/C++工程步骤总结(简洁版)

用 VS Code 调试C/C工程步骤总结(简洁版) 一、编写CMakeLists.txt 文件 简单模板如下&#xff1a; cmake_minimum_required(VERSION 3.0)project(SOLIDERFIRE)#在g编译时&#xff0c;添加编译参数&#xff0c;比如-Wall可以输出一些警告信息 set(CMAKE_CXX_FLAGS "${CM…

VS Code 配置 leetcode 环境

VS Code 配置 leetcode 环境 一、安装 leetcode 插件 二、安装依赖环境 通过该链接 link 下载linux 版本的 Node.js&#xff0c; 下载完进行安装 安装步骤&#xff1a; //1.对下载的文件进行解压 //2.创建目录 mkdir /usr/local/lib/node //3.移动目录,例如在放置下载的Node…

视觉SLAM十四讲笔记-3-01

视觉SLAM十四讲笔记-3-01 文章目录视觉SLAM十四讲笔记-3-01第三讲-三维空间刚体运动3.1 旋转矩阵和变换矩阵3.1.1点、向量和坐标系3.1.2 坐标系间的欧氏变换3.1.3 变换矩阵和齐次坐标3.2 实践&#xff1a;Eigen第三讲-三维空间刚体运动 参考链接&#xff1a; link&#xff0c;…

视觉SLAM十四讲笔记-3-02

视觉SLAM十四讲笔记-3-02 文章目录视觉SLAM十四讲笔记-3-023.3 旋转向量和欧拉角3.3.1 旋转向量3.3.2 欧拉角3.4 四元数3.4.1 四元数的定义3.4.2 四元数的运算3.4.3 用四元数表示旋转3.4.4 四元数到其他旋转表示的转换3.5 相似、仿射、射影变换参考链接&#xff1a; link&…

安装Pangolin时报Eigen3::Eigen错误解决办法

安装Pangolin时报Eigen3::Eigen错误解决办法 安装遇见的问题 这里需要安装基于 OpenGL 的 Pangolin 库。 slam 14 讲中是从 link 处下载的 Pangolin&#xff0c;我也用以下命令进行安装&#xff1a; //安装依赖库 sudo apt install libgl1-mesa-dev sudo apt install libgle…

VS Code 中解决 C++ 代码编写时的爆红

VS Code 中解决 C 代码编写时的爆红 现象 在 VS Code 中编写 C 代码时&#xff0c;发现正常的 C 11 特性竟然标红&#xff0c;但是可以正常运行。这说明语法没有错&#xff0c;这是由于VS Code 根据编译参数&#xff0c;无法检测 C11 相关语法&#xff0c;因此出现报红和 war…

视觉SLAM十四讲笔记-3-03

视觉SLAM十四讲笔记-3-03 文章目录视觉SLAM十四讲笔记-3-033.6 实践&#xff1a;Eigen几何模块3.6.1 Eigen几何模块的数据演示3.6.2实际的坐标变换例子3.7 可视化演示3.7.1 显示运动轨迹3.7.2 显示相机的位姿参考链接&#xff1a; link&#xff0c;高翔,张涛,等. 视觉 SLAM 十…