CMakeLists.txt总结

news/2025/1/11 12:48:24/

一. 结构

        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)


http://www.ppmy.cn/news/1451007.html

相关文章

WebGL是啥

WebGL&#xff08;全写为Web Graphics Library&#xff09;是一种3D绘图协议&#xff0c;这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起&#xff0c;通过增加OpenGL ES 2.0的一个JavaScript绑定&#xff0c;WebGL可以为HTML5 Canvas提供硬件3D加速渲染。这样&…

【JAVA基础之反射】反射详解

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 1.反射 1.1 概述 是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b; 对于任意一个对象&#xff0c;都能够调用它…

【保姆级教程】Linux上部署Stable Diffusion WebUI和LoRA训练,拥有你的专属图片生成模型

0 写在前面 Stable Diffusion 是当前最火热的图像生成模型之一&#xff0c;目前已经广泛应用于艺术创 作、游戏开发、设计模拟等领域&#xff0c;因其开源生态和易于使用而受到创作者的广泛关注&#xff0c;相比 Midjourney 而言&#xff0c;其最大的优势是完全免费&#xff0…

数据结构(三)------栈

制作不易&#xff0c;三连支持一下呗&#xff01;&#xff01;&#xff01; 文章目录 前言一、什么是栈二、栈的实现 1.栈的结构2.栈的初始化和销毁3.栈的插入数据和删除数据4.取栈顶元素总结 前言 前面我们介绍了第二种数据结构---链表&#xff0c;这里我们继续介绍下一种数据…

微隔离实施五步法,让安全防护转起来

前言 零信任的最核心原则→最小权限 安全的第一性原理→预防 零信任的最佳实践→微隔离 “零信任”这个术语的正式出现&#xff0c;公认是在2010年由Forrester分析师John Kindervag最早提出。时至今日&#xff0c;“零信任”俨然已成安全领域最热门的词汇&#xff0c;做安全…

Jetpack Compose简介

文章目录 Jetpack Compose简介概述声明式UI和命令式UIJetpack Compose和Android View对比Compose API设计原则一切皆为函数组合优于继承单一数据源 Jetpack Compose和Android View关系使用ComposesetContent()源码ComposablePreview Jetpack Compose简介 概述 Jetpack Compos…

Spring Boot中使用Redis和Lua脚本实现延时队列

码到三十五 &#xff1a; 个人主页 延时队列是一种常见的需求。延时队列允许我们延迟处理某些任务&#xff0c;这在处理需要等待一段时间后才能执行的操作时特别有用&#xff0c;如发送提醒、定时任务等。文中&#xff0c;将介绍如何在Spring Boot环境下使用Redis和Lua脚本来实…

使用 SSH 密钥配置 Git 账号需要以下步骤

1、生成 SSH 密钥&#xff1a; 如果你还没有 SSH 密钥&#xff0c;可以使用以下命令在电脑终端中生成一个新的 SSH 密钥&#xff1a; ssh-keygen -t rsa -b 4096 -f /Users/XXXX/.ssh/id_rsa_my_personal -C "your_emailexample.com" ssh-keygen 是用于生成 SSH 密…