cmake 安装和使用

355 阅读2分钟

1,先下载,安装cmake

网址 cmake.org/download/

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多目录构建】

  1. 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 一致。

  1. 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")
  1. ADD_EXECUTABLE(hello ${SRC_LIST})
ADD_EXECUTABLE(hello ${SRC_LIST})
# 定义了这个工程会生成一个文件名为hello的可执行文件,
# 相关的源文件是SRC_LIST中定义的源文件列表, 
# 本例中你也可以直接写成 ADD_EXECUTABLE(hello main.c)。
  1. 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

借鉴【www.cnblogs.com/52php/p/568…