Back_To_Home..
Cmake
January 2015 (200 Words, 2 Minutes)
MakeLists.txt是CMake构建系统的配置文件,用于描述项目的构建过程和相关属性等,以下是一些基本和常见的CMakeLists.txt语法:
指令语法
- 基本格式:CMake指令通常以指令名称开头,后面跟着参数,参数之间用空格或分号分隔,指令不区分大小写,但一般习惯使用大写字母。如
ADD_EXECUTABLE(MyApp main.cpp)。 - 注释:使用
#进行单行注释,从#开始到行末的内容都会被CMake忽略。
常用指令
- 项目信息定义
CMAKE_MINIMUM_REQUIRED:指定所需的CMake最低版本,如CMAKE_MINIMUM_REQUIRED(VERSION 3.0)。PROJECT:设置项目名称和语言等,如PROJECT(MyProject CXX),表示项目名为MyProject,主要语言是C++。
- 目标文件构建
ADD_EXECUTABLE:用于添加可执行文件,如ADD_EXECUTABLE(MyApp main.cpp),将main.cpp编译成名为MyApp的可执行文件。ADD_LIBRARY:添加库文件,如ADD_LIBRARY(MyLib SHARED source1.cpp source2.cpp),创建名为MyLib的共享库。
- 源文件和头文件路径设置
INCLUDE_DIRECTORIES:指定头文件搜索路径,如INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)。FILE(GLOB):用于获取指定目录下的文件列表,如FILE(GLOB SOURCES "src/*.cpp"),将src目录下所有.cpp文件添加到SOURCES变量中。
- 链接库设置
TARGET_LINK_LIBRARIES:指定目标文件要链接的库,如TARGET_LINK_LIBRARIES(MyApp MyLib),将MyApp与MyLib库进行链接。
- 编译选项设置
SET(CMAKE_CXX_FLAGS):设置C++编译选项,如SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror"),开启所有警告并将警告视为错误。
- 自定义命令和目标
ADD_CUSTOM_COMMAND:添加自定义命令,如在构建后执行脚本等,ADD_CUSTOM_COMMAND(TARGET MyApp POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${SOURCE_FILE} ${DESTINATION})。ADD_CUSTOM_TARGET:创建自定义目标,ADD_CUSTOM_TARGET(MyCustomTarget COMMAND ${CMAKE_COMMAND} -E echo "Custom target executed")。
变量和作用域
- 变量定义和使用:使用
SET指令定义变量,如SET(SOURCE_DIR src),使用变量时用${}括起来,如ADD_EXECUTABLE(MyApp ${SOURCE_DIR}/main.cpp)。 - 作用域:CMake变量有不同的作用域,包括全局作用域、目录作用域和目标作用域等。在一个CMakeLists.txt文件中定义的变量默认在当前目录及其子目录下有效。
条件判断和循环
- 条件判断:使用
IF、ELSEIF、ELSE和ENDIF进行条件判断,如IF(WIN32)判断是否为Windows系统。 - 循环:使用
FOREACH和ENDFOREACH进行循环操作,如FOREACH(file ${SOURCE_FILES}),可对SOURCE_FILES中的每个文件进行操作。
基础入门
- 项目结构:创建一个项目目录,在项目根目录下创建
CMakeLists.txt文件,若有多个源文件,可将其放在src目录下,头文件放在include目录下。 - 编写
CMakeLists.txt:在CMakeLists.txt中,使用cmake_minimum_required指定最低CMake版本要求,如cmake_minimum_required(VERSION 3.10)。使用project命令定义项目名称和版本,如project(MyProject VERSION 1.0)。使用add_executable命令指定可执行文件的名称和源文件,如add_executable(myapp src/main.cpp)。
进阶用法
- 添加库文件:若项目包含库文件,可在库文件所在目录下创建
CMakeLists.txt。使用add_library命令定义库,如add_library(mylib STATIC src/library.cpp)。在主CMakeLists.txt中,使用target_link_libraries命令将可执行文件与库链接,如target_link_libraries(myapp PRIVATE mylib)。 - 设置编译选项:使用
set命令设置编译选项,如set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror"),表示开启所有警告并将警告视为错误。还可设置CMAKE_BUILD_TYPE变量来指定构建类型,如set(CMAKE_BUILD_TYPE Debug),可选值有Debug、Release、RelWithDebInfo等。 - 查找和使用第三方库:使用
find_package命令查找第三方库,如find_package(OpenCV REQUIRED)。若第三方库提供了Config.cmake或XXXConfig.cmake文件,可直接使用find_package查找,然后使用target_link_libraries链接,如target_link_libraries(myapp PRIVATE OpenCV::opencv_core OpenCV::opencv_imgproc)。
高级技巧
- 自定义命令和目标:使用
add_custom_command和add_custom_target定义自定义命令和目标。如添加一个自定义命令用于在构建前生成一些数据文件,add_custom_command(OUTPUT data.txt COMMAND generate_data.sh DEPENDS generate_data.sh)。然后添加一个自定义目标,add_custom_target(generate_data ALL DEPENDS data.txt)。 - 跨平台编译:利用CMake的平台相关变量和条件判断实现跨平台编译。如根据不同平台设置不同的编译选项,
if(WIN32)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WIN32")elseif(UNIX)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUNIX")endif()。
构建和安装
- 构建项目:在项目根目录下创建
build目录,进入build目录,执行cmake ..生成构建文件,然后执行make命令进行编译。 - 安装项目:在
CMakeLists.txt中使用install命令指定安装规则。如安装可执行文件,install(TARGETS myapp DESTINATION bin);安装头文件,install(FILES include/mylib.h DESTINATION include)。构建完成后,执行make install命令进行安装。