CMakeLists.txt总结

一. 结构

        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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值