1,先下载,安装cmake
2. 其次创建源码目录,并根据命令生成可执行文件
mkdir -p /backup/cmake
touch main.c
touch CMakeLists.txt
在main.c中
#include <stdio.h>
int main(){
printf("hello world cmake\n");
return 0;
}
在CMakeLists.txt中
CMAKE_MINIMUM_REQUIRED(VERSION 3.4.1)
PROJECT(HELLO) #项目名称
SET(SRC_LIST main.c)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
然后命令行中运行下面
//生成CMakeFiles,CMakeCache.txt,cmake_install.cmake等文件,并且生成了Makefile。
cmake .
make
需要注意的是:windows平台下不会直接生成MakeFile,所以make命令会失败, 而且需要安装mingw这个编译工具 第一次要执行下面这个,而不是直接cmake
cmake .. -G "Unix Makefiles" (第一次运行cmake时,生成MakeFile文件)
mingw32-make #生成可执行文件.exe
执行cmake .会输出下面的
CMake Warning (dev) at CMakeLists.txt:6:
Syntax Warning in cmake code at column 37
\
Argument not separated from preceding token by whitespace.
This warning is for project developers. Use -Wno-dev to suppress it.
\
-- The C compiler identification is AppleClang 10.0.1.10010046
-- The CXX compiler identification is AppleClang 10.0.1.10010046
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- This is BINARY dir /Users/black/Documents/c_project/cmake_project/project1
-- This is SOURCE dir /Users/black/Documents/c_project/cmake_project/project1
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/black/Documents/c_project/cmake_project/project1
执行make会输出下面的,并且会生成可执行文件hello,就是CMakeLists.txt中配置的hello
[ 50%] Building C object CMakeFiles/hello.dir/main.c.o
[100%] Linking C executable hello
[100%] Built target hello
然后执行hello可执行文件
./hello
//得到输出
hello world cmake
3. CMakeLists.txt语法
CMakeLists.txt,这个文件是cmake的构建定义文件,文件名是大小写相关的,如果工程存在多个目录,需要确保每个要管理的目录都存在一个CMakeLists.txt【cmake多目录构建】
- project()的语法指令是
project(projectname [CXX][C][Java]) ### 指定工程名称和支持的语言
这个指令隐式的定义了两个cmake变量:
_BINARY_DIR 以及 _SOURCE_DIR,这里就是 HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR (所以CMakeLists.txt中两个MESSAGE指令可以直接使用了这两个变量),因为采用的是内部编译,两个变量目前指的都是工程所在路径,后面我们会讲到外部编译,两者所指代的内容会有所不同。 同时cmake系统也帮助我们预定义了 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR 变量,他们的值分别跟 HELLO_BINARY_DIR 与 HELLO_SOURCE_DIR 一致。
- set()的语法指令是
SET(var [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
现阶段,你只需要了解SET指令可以用来显式的定义变量即可。比如我们用到的是SET(SRC_LIST main.c),如果有多个源文件,也可以定义成:
SET(SRC_LIST main.c t1.c t2.c)
SET(SRC_LIST main.c) 也可以写成 SET(SRC_LIST "main.c")
- ADD_EXECUTABLE(hello ${SRC_LIST})
ADD_EXECUTABLE(hello ${SRC_LIST})
# 定义了这个工程会生成一个文件名为hello的可执行文件,
# 相关的源文件是SRC_LIST中定义的源文件列表,
# 本例中你也可以直接写成 ADD_EXECUTABLE(hello main.c)。
- MESSAGE(STATUS "this is log")
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR | WARNING ] "message to display")
向终端输出用户定义的信息或变量的值
SEND_ERROR, 产生错误,生成过程被跳过
STATUS, 输出前缀为—的信息
FATAL_ERROR, 立即终止所有cmake过程
WARNING 告警
4. cmake基本语法规则
(1)、变量使用${}方式取值,但是在IF控制语句中是直接使用变量名
(2)、指令(参数1 参数2...) 参数使用括弧括起,参数之间使用空格或分号分开。
# 以上面的ADD_EXECUTABLE指令为例,如果存在另外一个func.c源文件,就要写成:
ADD_EXECUTABLE(hello main.c func.c)
# 或者
ADD_EXECUTABLE(hello main.c;func.c)
(3)、指令是大小写无关的,参数和变量是大小写相关的。但,推荐你全部使用大写指令。
5.外部构建和内部构建
(1)、首先,请清除t1目录中除main.c CMakeLists.txt之外的所有中间文件,最关键的是CMakeCache.txt。
(2)、在t1目录中建立build 目录,当然你也可以在任何地方建立build目录,不一定必须在工程目录中。
(3)、进入build目录,运行 `cmake ..`
(注意,..代表父目录,因为父目录存在我们需要的CMakeLists.txt,如果你在其他地方建立了build目录,需要运行cmake <工程的全路径>),查看一下build目录,就会发现了生成了编译需要的Makefile以及其他的中间文件。
(4)、运行make构建工程,就会在当前目录(build目录)中获得目标文件hello。
上述过程就是所谓的out-of-source外部编译,一个最大的好处是,对于原有的工程没有任何影响,所有动作全部发生在编译目录。通过这一点,也足以说服我们全部采用外部编译方式构建工程。
这里需要特别注意的是:
通过外部编译进行工程构建,HELLO_SOURCE_DIR 仍然指代工程路径,即 /backup/cmake/t1 而HELLO_BINARY_DIR 则指代编译路径,即/backup/cmake/t1/build