您的位置:

CMake使用方法详解

一、CMake简介

CMake是一个跨平台的、自由开源的构建工具,它可以根据不同的编译器、平台和操作系统生成相应的构建文件。使用CMake可以方便地管理项目、生成makefile文件和Visual Studio工程。

CMake使用CMakeLists.txt文件来描述项目,通过在文件中定义编译选项、源文件、库和头文件等,来生成相应的构建文件。CMake可以生成多种构建文件,如Makefile, Ninja, Visual Studio等。

二、CMake工具链的安装

安装CMake之前,先安装C++编译器(如gcc、clang等)和make工具,以便编译生成的构建文件。CMake的安装包可以从官网(https://cmake.org/download/)或者包管理器(如yum、apt等)下载安装。

以Ubuntu系统为例,执行下列命令即可安装CMake:

sudo apt-get install cmake

三、CMakeLists.txt文件结构

CMakeLists.txt文件描述了项目的详细信息,包括编译选项、源文件、库和头文件等。一个简单的CMakeLists.txt文件结构如下所示:

cmake_minimum_required(VERSION 2.8) # 设定工具链的最低版本
project(hello) # 工程名

add_executable(hello main.cpp) # 添加可执行文件,指定源文件名

其中,cmake_minimum_required指定了CMake的最小版本,project指定了项目的名称。add_executable指定了可执行文件的名称和源文件名。

四、编译选项

CMake允许用户添加编译选项,以便在编译时进行特定的设置。例如,可以指定编译器的名称、标志和优化等级。下面是一个简单的例子:

cmake_minimum_required(VERSION 2.8)
project(hello)
# 设置编译选项
set(CMAKE_CXX_COMPILER "g++") # 设定编译器
set(CMAKE_CXX_FLAGS "-O2 -Wall") # 设定编译选项
add_executable(hello main.cpp)

五、源文件和库

在CMakeLists.txt文件中,可以通过add_library添加库文件,例如:

cmake_minimum_required(VERSION 2.8)
project(hello)
# 添加库文件
add_library(hello_lib hello.cpp)
# 将库和源文件链接起来生成可执行文件
add_executable(hello main.cpp)
target_link_libraries(hello hello_lib)

在add_executable中添加链接库的信息,将库文件和源文件链接起来,生成可执行文件。

六、外部库

在开发中,通常会依赖一些第三方库,例如OpenCV、Boost等。在使用CMake构建项目时,需要将这些库添加到项目中。

以OpenCV为例,首先需要指定OpenCV的路径、头文件和库文件。在CMake中,可以通过find_package和include_directories指令来实现:

cmake_minimum_required(VERSION 2.8)
project(hello)
# 添加OpenCV
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
# 添加可执行文件
add_executable(hello main.cpp)
# 链接OpenCV库
target_link_libraries(hello ${OpenCV_LIBS})

使用find_package指令搜索OpenCV,使用include_directories包含头文件路径,使用target_link_libraries链接库文件。

七、工程组织

当项目规模逐渐增大,源文件、头文件、库和可执行文件等会越来越多,这时需要更为有效的管理和组织这些文件。

在CMake中,可以使用aux_source_directory和file指令来搜索并添加多个源文件。

通过设置CMAKE_BINARY_DIR变量指定编译输出目录,通过set指定源文件和头文件所在的目录,例如:

cmake_minimum_required(VERSION 2.8)
project(hello)
# 设置编译输出目录
set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/build)
# 设置源文件和头文件路径
set(SRC_DIR ${PROJECT_SOURCE_DIR}/src/)
set(INC_DIR ${PROJECT_SOURCE_DIR}/include/)
# 查找源文件并添加到可执行文件中
aux_source_directory(${SRC_DIR} SRC_FILES)
add_executable(hello ${SRC_FILES})
# 包含头文件
include_directories(${INC_DIR})

上面示例中,通过设置CMAKE_BINARY_DIR变量指定编译输出目录,并设置SRC_DIR和INC_DIR的值。使用aux_source_directory指令查找源文件,使用include_directories包含头文件路径。

八、条件编译

在开发中,常常需要针对不同的操作系统、编译器和架构进行特定的设置。CMake提供了条件编译功能,可以针对不同的条件进行特定的设置。

下面是一个以平台类型为条件的条件编译示例:

cmake_minimum_required(VERSION 2.8)
project(hello)
# 判断平台类型,设置编译选项
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
    MESSAGE("MacOS")
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
    MESSAGE("Linux")
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
    MESSAGE("Windows")
endif()
# 添加可执行文件
add_executable(hello main.cpp)

使用if和endif判断平台类型,根据不同的条件执行相应的操作。