一. 结构
CMakeLists.txt一般组成结构如下:
1.cmake版本要求
2.project(项目名称)
3.设置编译参数(C++版本,-Wall=no等编译参数)
4.设置宏
5.设置目标文件版本号
6.添加编译的源文件
7.设置要编译的目标(二进制类型,参与编译的源文件)
8.设置头文件包含路径
9.设置依赖库引用路径
10.安装
二. 常用命令
add_library
用于在project中增加库文件目标,分为动态库和静态库,其使用格式如下:
add_library(<TARGET> SHARED/STATIC <SOURCE_FILE1> <SOURCE_FILE2>...)
add_executable
用于在project中增加可执行文件目标,其使用格式如下:
add_executable(<TARGET> <SOURCE_FILE1> <SOURCE_FILE2>...)
add_definition
用于在project中增加编译宏,其使用格式如下:
add_definition(-DHAVE_LOG)
add_definition(-DLOG_LEVEL=3)
file
file命令提供了一组文件操作,例如READ, GLOB等,以GLOB举例
#用于枚举/myproj/src目录下所有文件的路径添加到SRC_FILES参数中
file(GLOB SRC_FILES /myproj/src/*.cpp)
include_directories
用于设置头文件的引用目录,编译是cpp文件中的include头文件会去该引用目录中查找
include_directories(${CMAKE_SOURCE_DIR}/inc)
link_directories
用于设置引用的第三方外部库文件所在的目录
link_directories(/usr/lib)
link_libraries
用于设置编译target时需要引用的第三方库
link_libraries(libuuid libprotobuf)
set_target_properties
用于设置target的属性,例如target目标文件输出的目录位置,target目标文件的版本号,target目标文件的名称等
set_target_properties(uuid PROPERTIES VERSION 1.1.0)
set_target_properties(uuid PROPERTIES SOVERSION 1)
注意,属性等设置应该放在target的add_library, add_execute的下面,否则cmake的时候会提示set_target_properties的target找不到的情况
install
target目标的安装命令,注意,install命令需要在cmake编译的时候带上-DCMAKE_INSTSLL_PREFIX指定安装的根目录
cmake .. -DCMAKE_INSTALL_PREFIX=~/target/install,
在CMakeLists.txt中,使用install命令设定target的头文件,库文件,二进制,配置文件等的安装位置
install(TARGETS myExe mySharedLib myStaticLib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib/static)其中,RUNTIME,LIBRARY,ARCHIVE代表的是目标文件的类型,分别代表可执行程序,动态库和静态库,此外还有FILE类型代表文件,我个人一般使用FILE类型来安装头文件
三.常用内置变量
1. CMAKE_CURRENT_SOURCE_DIR:当前CMakeLists.txt文件所在目录
2. CMAKE_MODULE_PATH:cmake模块文件所在目录,cmake模块文件以.cmake结尾,一般用于大型CMake工程或者交叉编译(工具链和编译/目标平台的设置一般都放在.cmake文件中)
3. PROJECT_NAME:CMakeList.txt中project指令所设置的工程名称
4.ENV:用于获取系统设置的环境变量,例如message(WARNING "$ENV{PATH}")
5.下面几个变量是和交叉编译相关的
5.1 CMAKE_SYSTEM_NAME 目标二进制所运行的操作系统(linux,darwin)
5.2 CMAKE_SYSTEM_PROCESSOR 目标二进制所运行设备的处理器(arm,x86)
5.3 CMAKE_C_COMPILER 交叉编译使用的c编译器路径
5.4 CMAKE_CXX_COMPILER 交叉编译使用的c++编译器路径
四. 交叉编译
先创建一个cmake模块文件,例如arm_toolchain_setup.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(tool /Users/chengbinliang/Downloads/gcc-arm-none-eabi-10.3-2021.10/bin)
set(CMAKE_C_COMPILER ${tool}/arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER ${tool}/arm-none-eabi-g++)
该cmake模块文件的作用就是设置交叉编译工具链的环境,然后在使用cmake的时候,通过
cmake -DCMAKE_TOOL_CHAIN
五. 范例
cmake_minimum_required(VERSION 3.15.4)
project(uuid)
message(WARNING "build project ${PROJECT_NAME}")
file(GLOB UUID_SRC uuid/*.c)
file(GLOB UUID_HDR uuid/*.h)
message(WARNING "build source file ${UUID_SRC}")
add_definitions("-Wall -g")
add_definitions("-DHAVE_USLEEP")
set(CMAKE_C_FLAGS "--specs=nosys.specs $(OTHER_LINK_OPTIONS)")
add_library(${PROJECT_NAME} SHARED
${UUID_SRC})
set_target_properties(uuid PROPERTIES VERSION 1.3.0)
set_target_properties(uuid PROPERTIES SOVERSION 1)
include_directories(${PROJECT_SOURCE_DIR}/uuid)
install(uuid)