Cmake¶
This tutorial can be found in the Tests/Tutorial directory of the CMake source code tree.
内部编译¶
使用Cmake时,在CmakeLists.txt 中配置相关信息,例如:
//cmake 的构建定义文件,文件名是大小写相关的,如果工程存在多个目录,需要确保每个要管理的目录都存在一个CMakeLists.txt
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})
//会生成一个文件名为 hello 的可执行文件,相关的源文件是 SRC_LIST 中定义的源文件列表
ADD_EXECUTABLE(hello SRC_LIST)
结束后
cmake . # 命令后面的点号,代表本目录
此时系统自动生成了: CMakeFiles
, CMakeCache.txt
, cmake_install.cmake
等文件,并且生成了 Makefile
。继续
make # 如果想了解 make 构建的详细过程,
# 可以使用 make VERBOSE=1 或者 VERBOSE=1make 命令来进行构建。
可生成可执行文件,通过 ./XXX Args
运行
若要清理工程,可执行
make clean
外部编译¶
以上是 内部编译 的例子,它生成了一些无法自动删除的中间文件,所以,引出了我们对 外部编译 的探讨(实际上cmake 强烈推荐的是外部构建),外部编译的过程如下:
清除工程目录中除源代码文件和
CmakeLists.txt
之外的所有中间文件;在工程目录中建立
build
目录,当然你也可以在任何地方建立 build 目录,不一定必须在工程目录中;进入
build
目录,运行cmake ..
注解
..代表父目录,因为父目录存在我们需要的CMakeLists.txt,如果你在其他地方建立了 build 目录,需要运行 cmake <工程的全路径>
查看一下 build 目录,可以发现生成了编译需要的 Makefile 以及其他的中间文件;
运行 make 构建工程,就会在当前目录(build)中获得目标文件
外部编译一个最大的好处是,对于原有的工程没有任何影响,所有动作全部发生在编译目录。
警告
通过外部编译进行工程构建,HELLO_SOURCE_DIR 仍然指代工程路径,而 HELLO_BINARY_DIR 则指代编译路径
调试¶
在 CMakeLists.txt文件中添加如下内容:
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
在cmake中有一个全局的环境变量,CMAKE_BUILD_TYPE,可以取Release或者Debug等值。然后可以通过设置CMAKE_CXX_FLAGS_DEBUG来设置在debug时的CXXFLAGS,这个值大家肯定都熟悉的哈。如果不需要添加调试信息,就直接修改CMAKE_BUILD_TYPE的值。