cmake 学习1
基本解释
cmake和autotools是makefile的上层工具,它们的目的正是为了产生可移植的makefile,并简化自己动手写makefile时的巨大工作量。如果你自己动手写过makefile,你会发现,makefile通常依赖于你当前的编译平台,而且编写makefile的工作量比较大,解决依赖关系时也容易出错。因此,对于大多数项目,应当考虑使用更自动化一些的 cmake或者autotools来生成makefile,而不是上来就动手编写。
安装
建议在linux上使用,windows下开发常常需要使用windowsAPI,此时使用visual studio更方便一点,支持的也更好。
我是在ubuntu上安装cmake
su
apt install cmake
基本使用
从“Hello, world!”开始
创建main.c
main.c
#include<stdio.h>
int main()
{
printf("Hello,World\n");
return 0;
}
创建CMakeLists.txt
CMakeLists.txt
#cmake最低版本需求,不加入此行会受到警告信息
CMAKE_MINIMUM_REQUIRED(VERSION 3.16)
PROJECT(HELLO) #项目名称
#把当前目录(.)下所有源代码文件和头文件加入变量SRC_LIST
AUX_SOURCE_DIRECTORY(. SRC_LIST)
#生成应用程序 hello
ADD_EXECUTABLE(hello ${SRC_LIST})
编译项目
为了使用外部编译方式编译项目,需要先在目录hello下新建一个目录build(也可以是其他任何目录名)。现在,项目整体的目录结构为:
hello/
|– CMakeLists.txt
|– build /
|– main.c
amazing@amazing:~/c++/cmake_hello$ ls
build CMakeLists.txt main.c
amazing@amazing:~/c++/cmake_hello$ cd build/
amazing@amazing:~/c++/cmake_hello/build$ ls
amazing@amazing:~/c++/cmake_hello/build$ cmake ..
-- The C compiler identification is GNU 9.3.0
-- The CXX compiler identification is GNU 9.3.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/amazing/c++/cmake_hello/build
amazing@amazing:~/c++/cmake_hello/build$ make
Scanning dependencies of target hello
[ 50%] Building C object CMakeFiles/hello.dir/main.c.o
[100%] Linking C executable hello
[100%] Built target hello
amazing@amazing:~/c++/cmake_hello/build$ ls
CMakeCache.txt CMakeFiles cmake_install.cmake hello Makefile
amazing@amazing:~/c++/cmake_hello/build$
上面,我们提到了一个名词,叫外部编译方式。其实,cmake还可以直接在当前目录进行编译,无须建立build目录。但是,这种做法会将所有生成的中间文件和源代码混在一起,而且cmake生成的makefile无法跟踪所有的中间文件,即无法使用”make distclean”命令将所有的中间文件删除。因此,我们推荐建立build目录进行编译,所有的中间文件都会生成在build目录下,需要删除时直接清空该目录即可。这就是所谓的外部编译方式。
然而我使用 make disclean 也没有效果,得找个更好一点的教程