Back_To_Home..
Cmake
January 2015 (199 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
命令进行安装。