一、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判断平台类型,根据不同的条件执行相应的操作。