CMake学习

Author Avatar
Magicmanoooo 3月 09, 2019
  • 在其它设备中阅读本文章

什么是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路径下的makemingw32-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++编译器

上述出现的一些命令:

  1. cmake_mimimum_required:指定运行此配置文件所需的CMake的最低版本
  2. project:参数值Demo,该命令表示项目的名称是Demo
  3. 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. 多个目录,多个源文件

这种情况,需要分别在项目的根目录Demo3math目录里各编写一个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