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

基于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 中编写的两个小工程上做实验。

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即可。

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即可。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值