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 也没有效果,得找个更好一点的教程

文章目录