目录
在 linux 平台下使用 CMake 构建C/C++工程的流程:
当前项目目录结构
最小CMake工程
进入文件夹5.3.1,VScode打开项目文件5.3.1
在项目5.3.1顶层目录中,New File一个CMakeLists.txt
编写CMakeLists.txt
编译CMakeLists.txt(两种方式)
内部构建(不建议使用)
外部构建(推荐使用)
多目录文件工程CMake编译
当前工程文件5.3.2目录结构
在顶层目录5.3.2单击右键,New File一个CMakelIsts.txt
编写文件CMakelIsts.txt
有两个项目5.3.1和5.3.2
cmake_minimum_required(VERSION 3.0) #指定 cmake最小版本要求为3.0
project(HELLOWORLD) #指定项目名称,习惯用大写指定项目名称
#等价于g++ helloworld.cpp -o helloworld;helloworld_cmake帮助区分以前生成的helloword
#第一个参数指定生成可执行文件名称helloworld_cmake,第二参数要编译的源文件helloworld.cpp
add_executable(helloworld_cmake helloworld.cpp)
注意:CMakeLists.txt文件的注释是用#
可在终端查看当前安装的camke版本信息
内部构建会在同级目录下产生一大堆中间文件,这些中间文件并不是我们最终所需要的,和
工程源文件放在一起会显得杂乱无章。流程如下:
内部构建——直接在当前文件夹下编译CMakeLists.txt;
1 在当前目录下,编译本目录的CMakeLists.txt,生成Makefile和其他文件
2 cmake .
3 执行make命令,生成target
4 make
编译前文件夹目录如下:
ctrl+`打开终端编译CMakeLists.txt,cmake . 表示对当前目录下的CMakeLists.txt进行编译;
编译信息解释:
HP-virtual-machine:~/c++/5.3/5.3.1$ cmake .
//下列至Detecting结束,在检测c++编译器
-- The C compiler identification is GNU 7.5.0
-- The CXX compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done //生成配置信息
-- Generating done //生成完成
-- Build files have been written to: /home/hkm/c++/5.3/5.3.1 //说明新建文件被写到了/home/hkm/c++/5.3/5.3.1路径文件夹下
编译后文件夹目录显示如下:(发现多了很多中间文件,编译前只有3个文件)
对Makefile文件进行make;
编译信息解释:
HP-virtual-machine:~/c++/5.3/5.3.1$ make
Scanning dependencies of target helloworld_cmake
[ 50%] Building CXX object CMakeFiles/helloworld_cmake.dir/helloworld.cpp.o //正在构建cpp.o文件
[100%] Linking CXX executable helloworld_cmake //链接可执行文件helloworld_cmake
[100%] Built target helloworld_cmake //生成target,target名字叫helloworld_cmake
在文件夹目录下可以看到生成的helloworld_cmake
查看存在两个可执行文件;
执行helloworld_cmake文件;
将编译输出文件与源文件放到不同目录中;流程如下:
外部构建
1. 在当前目录下,创建build文件夹
mkdir build
2. 进入到build文件夹
cd build
3. 编译上级目录的CMakeLists.txt,生成Makefile和其他文件
cmake ..
4. 执行make命令,生成target
make
删除内部构建生成的中间文件,仅保留构建前的3个文件;
第一步:在当前目录下,创建build文件夹并进入build
编译CMakeLists.txt,由于现在终端在build文件夹下,CMakeLists.txt在当前路径的上一级目录,因此是cmake . .
执行make命令;
此时查看,此次生成的中间文件,全部放在build文件下,文件夹目录不再看起来混乱
点击展开build文件夹显示如下:
执行build文件夹下生成的可执行文件./helloworld_cmake
cmake_minimum_required(VERSION 3.0)
project(SWAP)
#等价于g++ main.cpp src/swap.cpp -Iinclude -o main中的-Iinclude头文件搜索路径
include_directories(include)
#等价于g++ main.cpp src/swap.cpp -Iinclude -o main_cmake
add_executable(main_cmake main.cpp src/swap.cpp)
执行生成的可执行文件main_cmake; 可见,无论用cmake还是g++进行构建,效果一致;