1.简介

cmake 允许开发者编写一种与平台无关的CmakeList.txt文件,来定制整个编译流程。cmake能更好的进行跨平台的编译。

2. cmake用法

cmake_minimum_required(VERSION 3.0.0) cmake当前的版本
project(pro003 VERSION 0.1.0)  表示项目的名称是pro003。
include(CTest)  包含cmake提供的测试工具
enable_testing() 启动单元测试
  • AUX_SOURCE_DIRECTORY(< dir > < variable >): AUX_SOURCE_DIRECTORY ( . DIR_SRCS):将当前目录中的源文件名称赋值给变量 DIR_SRCS
  • ADD_SUBDIRECTORY(src): 指明本项目包含一个子目录 src
  • SET(SOURCES src/Hello.cpp src/main.cpp):创建一个变量,名字叫SOURCE。它包含了这些cpp文件。
  • ADD_EXECUTABLE(main ${SOURCES }):指示变量 SOURCES 中的源文件需要编译 成一个名称为 main 的可执行文件。 ADD_EXECUTABLE() 函数的第一个参数是可执行文件名,第二个参数是要编译的源文件列表。因为这里定义了SOURCE变量,所以就不需要罗列cpp文件了。等价于命令:ADD_EXECUTABLE(main src/Hello.cpp src/main.cpp)
  • ADD_LIBRARY(hello_library STATIC src/Hello.cpp):用于从某些源文件创建一个库,默认生成在构建文件夹。在add_library调用中包含了源文件,用于创建名称为libhello_library.a的静态库。
  • TARGET_LINK_LIBRARIES( main Test ):指明可执行文件 main 需要连接一个名为Test的链接库。添加链接库。
  • TARGET_INCLUDE_DIRECTORIES(hello_library PUBLIC ${PROJECT_SOURCE_DIR}/include):添加了一个目录,这个目录是库所包含的头文件的目录,并设置库属性为PUBLIC
  • MESSAGE(STATUS “Using bundled Findlibdb.cmake…”):命令 MESSAGE 会将参数的内容输出到终端。
  • FIND_PATH () :指明头文件查找的路径,原型如下:find_path(< VAR > name1 [path1 path2 ...]) 该命令在参数 path* 指示的目录中查找文件 name1 并将查找到的路径保存在变量 VAR 中。
  • FIND_LIBRARY(): 同 FIND_PATH 类似,用于查找链接库并将结果保存在变量中

 编译项目类型

1.同一目录,多个源文件

 

./pro003
|
+--- main.cpp
|
+---test.cpp
|
+--- test.h

cmakelist .txt

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (pro003)
# 指定生成目标
add_executable(Demo main.cpp test.cpp)

在 add_executable 命令中增加了一个 test.cpp 源文件.

若是源文件比较多,则使用aux_source_directory 将当前目录中的源文件名称赋值给变量 DIR_SRCS,如

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (pro003)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable(Demo ${DIR_SRCS})

多目录,多个源文件

./pro004
|
+--- main.cpp
|
+--- tools/
|
+---- tools.cpp
|
+----tools.h

 

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (pro004)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 添加 tools子目录
add_subdirectory(tools)
# 指定生成目标
add_executable(pro004 main.cpp)
# 添加链接库
target_link_libraries(pro004 tools)