CMake学习
什么是CMake
如果软件想跨平台,必须要保证能够在不同平台编译。但现在存在各种不同的make工具,就得为每一种标准写一次Makefile。
CMake就是为了针对上述这种问题所设计的工具:它首先允许开发者编写一种平台无关的CMakeLists.txt文件来指定整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化Makefile和工程文件,如Unix的Makefile或者Windows的Visual Studio工程,从而做到write once,run everywhere。
1. Windows平台下
在Windows下,需要在设置编译器的时候,gcc和g++后面要加上.exe。需要在CMakeLists.txt所在的目录下,运行如下命令:
cmake -G "MinGW Makefiles" .
【注】:在上面的命令的最后一行的这个.
不能丢,代表的是当前路径。
此外,在MinGW路径下的make
叫mingw32-make.exe
,在运行的时候,需要使用的命令为:
mingw32-make
此外,在CMakeLists.txt中需要设置为:
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo1)
# 指定生成目标
add_executable(Demo main.cc)
set(CMAKE_C_COMPLIER D:/Software/Programming/MinGW/bin/gcc.exe #设置C编译器
set(CMAKE_CXX_COMPLIER D:/Software/Programming/MinGW/bin/g++.exe) #设置C++编译器
上述出现的一些命令:
cmake_mimimum_required
:指定运行此配置文件所需的CMake的最低版本project
:参数值Demo
,该命令表示项目的名称是Demo
add_executable
:将名为main.cc
的源文件编译成一个名为Demo
的可执行文件
在linux平台下
在当前目录下执行cmake .
,得到Makefile后再使用make
命令编译得到Demo
可执行文件。
多个源文件
1. 同一个目录,多个源文件
在这种情况下,可以在add_executable
命令中增加多个源文件。虽然这么写没问题,但当源文件过多时,就需要把所以源文件的名字都加进去,这就是很繁琐的工作。比较简单的方法是:使用aux_source_directory
命令,该命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。其语法如下:
aux_source_directory(<dir> <variable>)
所以,可以修改CMakeLists.txt:
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable(Demo ${DIR_SRCS})
这样,CMake会将当前目录的所有源文件的文件名赋值给变量DIR_SRCS
,再指示变量DIR_SRCS
中的源文件需要编译成一个名为Demo
的可执行文件。
2. 多个目录,多个源文件
这种情况,需要分别在项目的根目录Demo3
和math
目录里各编写一个CMakeLists.txt文件。为了方便起见,可以先将math
目录下的文件编译成静态库,再由main
函数进行调用。
- 使用命令
add_subdirectory
指明此项目包含一个子目录math
,这样math
目录下的CMakeLists.txt文件和源代码将会被处理。 - 使用命令
target_link_libraries
指明可执行文件main
需要链接一个名为MathFunctions
的链接库。
根目录中的CMakeLists.txt为:
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo3)
aux_source_directory (. DIR_SRCS)
# 添加math子目录
add_subdirectory(math)
add_executable(Demo main.cc)
# 添加链接库
target_link_libraries(Demo MathFunctions)
自定义编译选项
CMake 允许为项目增加编译选项,从而可以根据用户的环境和需求选择最合适的编译方案。例如,可以将MathFunctions
库设置为可选的库,如果该选项为ON
,则就使用该库定义的数学函数来进行计算,否则就调用标准库中的数学函数库。
1. 修改CMakeLists.txt文件
需要在项目的最高层的CMakeLists.txt文件中添加该选项:
# CMake最低版本号要求
cmake_minumum_required (VERSION 2.8)
# 项目信息
project (Demo)
# 加入一个配置头文件,用于处理CMake对源码的设置
configure_file (
"${PROJECT_SOURCE_DIR}/config.h.in"
"${PROJECT_BINARY_DIR}/config.h"
)
# 是否使用自己的MathFunctions库
option (USE_MYMATH
"Use provided math implemetation" ON
)
# 是否加入MathFunctions库
if (USE_MYMATH)
include_directoris ("${PROJECT_SOURCE_DIR}/math")
add