CMakeLists.txt详解

2023-05-16

一:CMakeLists.txt文件是cmake用来生成Makefile文件需要的一个描述编译链接的规则文件

学习cmake需要提前了解gcc等编译命令,先来解释一条最简单的命令

        gcc ./source/*.c -o ./bin/test -I ./include -L ./lib/ -l动态库名

上述命令的解释为:用gcc工具编译当前目录下source文件夹中的所有的.c文件 生成目标为test的可执行文件且将其放在当前目录下的bin文件夹中,其所用到的头文件所在路径为当前目录下的include文件夹,动态库文件路径为当前目录下的lib文件夹,编译时需要用到的动态库为库名所对应的.so动态库

二:CMakeList.txt规则文件常用变量

(1)常用变量

        PROJECT_NAME:用函数project(demo)指定的项目名称,这里变量的值为demo

        PROJECT_SOURCE_DIR:工程的根目录

        PROJECT_BINARY_DIR:执行cmake命令的目录,如果mkdir build ,cd build, cmake ../,的话,该变量的值为build目录

        CMAKE_CURRENT_SOURCE_DIR:当前处理的CMakeLists.txt文件所在目录

        CMAKE_CURRENT_BINARY_DIR:cmake当前正在处理的二进制目录

        CMAKE_CURRENT_LIST_DIR:CMakeLists.txt的完整路径

        CMAKE_CURRENT_LIST_LINE:当前所在行

        CMAKE_C_FLAGS:设置C编译选项

        CMAKE_CXX_FLAGS:设置C++编译选项

        CMAKE_INSTALL_PREFIX:指定install指令安装文件的根目录

        EXECUTABLE_OUTPUT_PATH:生成目标可执行文件的输出位置

        LIBRARY_OUTPUT_PATH:库文件输出位置

    三:指令详解

             需要注意的是CMakeLists.txt文件中的指令不区分大小写 

(1)PROJECT(projectname [CXX] [C] [Java]):

该函数定义工程名字,并指定了工程的语言,支持语言的列表可以省略,默认情况下表示支持所有语言,并隐式定义了两个cmake的变量   

        PROJECT_BINARY_DIR:执行cmake的目录

        PROJECT_SOURCE_DIR:工程的根目录

(2).SET(<variable> <value>... [PARENT_SCOPE])

显式设置普通变量

        variable:只能有一个;
        value:可以有0个,1个或多个,当value值为空时,方法同unset,用于取消设置的值;
        PARENT_SCOPE(父作用域):作用域,除PARENT_SCOPE外还有function scope(方法作用域)和directory scope(目录作用域)。

     2.set(<variable> <value>... CACHE <type> <docstring> [FORCE]) #设置缓存条目

        variable:只能有一个
        value:可以有0个,1个或多个,当value值为空时,方法同unset,用于取消设置的值
        CACHE:关键字,说明是缓存变量设置
        type(类型):必须为以下中的一种:
                BOOL:有ON/OFF,两种取值
                FILEPATH:文件的全路径
                PATH:目录路径
                STRING:字符串
                INTERNAL:字符串
        docstring:总结性文字(字符串)
        [FORCE]:变量名相同,第二次调用set方法时,第一次的value将会被覆盖

     3.set(ENV{<variable>} [<value>]) #设置环境变量

        variable:只有一个

  value:一般来说,只有一个,为空时,将清除之前设置的变量值,多个时,取值最近的一个,之后的值将被忽略

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin):设置可执行文件的输出路径为build/bin

set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib):设置库文件的输出路径为build/lib

(3)include_directories(xxx)

                给工程添加头文件,例如使用opencv时需要包含/usr/local/include/opencv/cv.h这个头文件,则我们需要include_directories(/usr/local/include),在调用的函数里写 #include “opencv/cv.h”即可

        target_include_directories()

                为指定的目标添加搜索头文件

include_directories()和target_include_directories()区别

include_directories 会为当前CMakeLists.txt的所有目标,以及之后添加的所有子目录的目标添加头文件搜索路径。因此,慎用,会影响全局target

target_include_directories 只会为指定目标包含头文件搜索路径。如果想为不同目标设置不同的搜索路径,target_include_directories 更合适

例:target_include_directories(test xxx ${PROJECT_SOURCE_DIR}/include)

如果xxx为PRIVATE 则表示头文件只能由 test使用

如果xxx为INTERFACE 则表示头文件只能由 调用test的文件使用

如果xxx为PUBLIC 则test和任何调用test的文件都能使用头文件

(4)add_executable(可执行文件名 1.cpp 2.ppp …)

添加可执行文件,其中可执行文件需要用到1.cpp和2.cpp 工程会给1.cpp和2.cpp编译生成一个可执行文件

(5)add_library(生成的库名称 STATIC/SHARED 源文件.cpp)

将源文件生成 静态/动态 库文件 STSTIC 表示静态库最终会编入到可执行文件中,SHARED(常见参数)表示动态库(又称共享库)方式

(6)target_link_libraries (库/可执行文件 library1 library2 ...)

为库或者可执行文件添加需要链接的库

注:需要放在add_executable之后

(7)add_subdirectory(source_dir)

向当前工程添加存放其他源文件的子目录,用于多目录下都有CMakeLists.txt文件的情况

(8)aux_source_directory( 文件目录 变量名)

把文件目录下的所有源文件储存在变量中

例:aux_source_directory(${PROJECT_SOURCE_DIR}/ DIR_SRCS) 表示把工程目录的源文件添加到DIR_SRCS变量中

(9)message(模式 "output msg" )

打印输出信息,常见模式有FATAL_ERROR、WARNING、STATUS、DEBUG等

(10)find_package(<NAME> 版本号 EXACT/QUIET/REQUIRED)

version:指定查找库的版本号。 EXACT:要求该版本号必须精确匹配。 QUIET:禁掉没有找到时的警告信息。如果没找到则忽略这一问题,继续执行 REQUIRED选项表示如果包没有找到的话,CMake的过程会终止,并输出警告信息

当find_package找到一个库的时候,以下变量会自动初始化:

<NAME>_FOUND : 显示是否找到库的标记
<NAME>_INCLUDE_DIRS 或 <NAME>INCLUDES : 头文件路径
<NAME>_LIBRARIES 或 <NAME>_LIBS : 库文件 

注:如果CMake自动找不到路径,我们需要手动设置路径,如 先 set(OpenCV_INCLUDE_DIRS “home/hwh/Opencv3.1/build”) 设置路径 然后find_package(OpenCV 3.1 REQUIRED)

(11)file(GLOB 变量 "路径")

会在路径下查找目标文件并保存在变量中

(12)execute_process(COMMAND shell命令 WORKING_DIRECTORY shell命令的工作目录)

执行shell命令
(13)foreach(var ${list})

                xxx

          endforeach()

变量var从list中取值,并循环执行xxx命令

(14)install指令

install(TARGETS a.a b.so exe ARCHIVE a.a  DESTINATION lib/  LIBRARY b.so DESTINATION lib/ RUNTIME exe DESTINATION bin/)

TARGETS:通过ADD_EXECUTABLE ADD_LIBRARY定义的目标文件,ARCHIVE特指静态库,LIBRARY特指动态库,RUNTIME特指可执行目标二进制,DESTINATION定义了安装的路径

FILE:普通文件的安装

PROGRAMS :可执行脚本

DIRECTORY:目录安装

(15)add_definitions()

向编译器添加-D定义,如ADD_DEFINITIONS(-DENABLE_DEBUG -DABC),参数之间用空格隔开

如果代码中定义了#ifdef ENABLE_DEBUG #endif,这个代码块就会生效

如果要添加其他编译器开关,可以通过CMAKE_C_FLAGS变量和CMAKE_CXX_FLAGS变量设置

(16)ADD_DEPENDENCIES()

定义target依赖其他的target,确保在编译本target之前,其他的target以及被构建

(17)FILE()

文件操作指令

(18)include(file OPTIONAL)

用于载入CMakeLists.txt文件和.cmake文件,模块文件搜索路径与CMAKE_MODULE_PATH

变量指定的路径有关,OPTIONAL参数作用是即使文件不存在也不报错

(19)find_xxx(<VAR> name1 path1 path2)

查找相应的文件,VAR变量表示找到文件的全路径

(20)

function的定义格式如下:后面可作为命令供调用

function(<name> [<arg1> ...])

        <commands>

endfunction()

其中name是function的名字,参数为arg1, arg2等。

注意:变量的取值使用${},但在if控制语句中和直接使用变量名

                   Make VERBOSE=1可以看到makefile执行的详细步骤

                   CMAKE_INCLUDE_PATH 与CMAKE_LIBRARY_PATH是环境变量,两者都被用于find_path

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMakeLists.txt详解 的相关文章

  • 【C++】ifstream读取txt文件内容

    头文件 include lt iostream gt include lt fstream gt include lt cassert gt include lt string gt 1 逐行读入文件 void readTxt string
  • CMakeLists.txt 语法介绍与实例演练

    一 Cmake 简介 cmake 是一个跨平台 开源的构建系统 它是一个集软件构建 测试 打包于一身的软件 它使用与平台和编译器独立的配置文件来对软件编译过程进行控制 二 常用命令 1 指定 cmake 的最小版本 cmake minimu
  • CMake&CMakeList.txt

    1 各种关系 在各种开源项目中 xff0c 经常会发现项目中除了代码源文件 xff0c 还包含了 CMakeList txt Makefile 文件 xff0c 在项目的编译时候需要用到的命令有 cmake make 我们本次想搞清楚他们之
  • Cmake知识----编写CMakeLists.txt文件编译C/C++程序

    简述 xff1a CMake是一个跨平台的安装 编译 工具 可以用简单的语句来描述所有平台的安装 编译过程 他能够输出各种各样的makefile或者project文件 能测试编译器所支持的C 43 43 特性 类似UNIX下的automak
  • ros里Catkin的CMakelists/package.xml

    Catkin是基于CMake的编译构建系统 xff0c 具有以下特点 xff1a Catkin沿用了包管理的传统像 find package 基础结构 pkg config扩展了CMake xff0c 例如 软件包编译后无需安装就可使用 自
  • ROS CMakeLists.txt中catkin_package和INCLUDE_DIRS的区别

    CMakeLists txt中 catkin package INCLUDE DIRS include 这里代表的是catkin的构建选项 xff0c INCLUDE DIRS表示将使用INCLUDE DIRS后面的内部目录include
  • 数据处理:Excel读取txt文本

    数据处理 xff08 一 xff09 xff1a Excel读取txt文本 1 1 任务需求 txt 文本为四列数据 xff0c 以空格为分隔符号 xff0c 现导入 Excel 中 1 2 实现步骤 新建 excel 文件点击 数据 来自
  • ROS Catkin 教程之 CMakeLists.txt

    1 概览 CMakeLists txt 是用 CMake 构建系统构建 ROS 程序包的输入文件 任何兼容 CMake 的包都包含一个或多个 CMakeLists txt 文件 xff0c 用以描述怎样构建和安装代码 catkin 项目采用
  • CMakeLists 理解

    CMakeLists 理解 最近发现其实之前对CMakeLists 理解不是很全面 xff0c 零零散散在网上看到的一些教程 xff0c 其实都是为了解决某个命令的问题 xff0c 要不然就是对一些命令的翻译理解 xff0c 实际上是很劝退
  • python 读取一个文件夹下的所jpg文件保存到txt中

    最近需要使用统计一个目录下的所有文件 xff0c 使用python比较方便 xff0c 就整理了一下代码 1 import os 2 3 def gci filepath 4 files 61 os listdir filepath 5 f
  • ajax authorization,jquery ajax 添加自定义请求头 - Authorization 字段.txt

    jquery ajax 添加自定义请求头 Authorization 字段 txt 参考 xff1a https www cnblogs com yanggb p 12039665 html https www w3school com c
  • 数据集txt格式划分为多个txt文件夹

    简单记录一下数据标签txt格式划分为多个文件 xff0c 通常我们标注号的标签 xff0c 都是在一个txt文件夹中 xff0c 我们训练的时候需要把txt中的标签按照一定的比例划分为多个文件 xff0c 这里贴出划分为三个文件的代码 xf
  • CMakeLists.txt 构建 Qt工程

    源码路径下包括 xff1a main cpp test cpp test h test ui test qrc cmake minimum required VERSION 3 1 0 project test SET CMAKE INCL
  • Cmakelists配置多级目录的gtest项目(项目代码和测试代码分离)

    cmake一些语法定义 之前的博客主要写了怎么配置gtest项目 xff0c 但是一般项目代码和测试代码并不在一起 xff0c 所以尝试将代码分离 主要分成三个部分 xff0c 下面给出demo的分级目录 gtest demo CMakel
  • COLMAP导出相机外参(bin文件转txt文件)

    官方给出的images txt如下图 Image list with two lines of data per image 每张图像数据占两行 IMAGE ID QW QX QY QZ TX TY TZ CAMERA ID NAME 图像
  • Java解析txt文件

    Java解析txt文件 package com wb test import java io BufferedReader import java io File import java io FileInputStream import
  • Windows从命令行创建文本文件的两种方式

    第一种方式 copy con 文件名 然后可以输入文件内容 完成后打Ctrl Z退出 输入的内容被保存为一个文件 第二种 如下 echo gt 文件名 创建一个空的文件 当然你可以创建任何后缀名的文本类文件 创建一个SQL文件也是没问题的
  • 将多个 ID 映射到 Active Directory 中的电子邮件地址并将结果输出到单个文件

    我正在尝试找到一种方法 将多个用户的 ID 映射到 Active Directory AD 中的关联电子邮件地址 然后将输出附加到 txt 文件中 最终生成包含电子邮件地址列表的单个文件 通过利用 PowerShell AD 工具的以下命令
  • [Python进阶] Python处理txt文件:open

    7 1 Python处理txt文件 open 在Python中 通过open函数可以打开一个文件 创建一个file对象 然后对该对象进行读写 函数语法 open name mode buffering 参数说明 name 文件名 mode
  • 如何在python中修改Yolo .txt文件的值

    我想修改包含 txt 文件的文件夹 txt 文件如下所示 3 0 695312 0 523958 0 068750 0 052083 3 0 846875 0 757292 0 071875 0 031250 3 0 830469 0 71

随机推荐

  • TRIZ创新方法——技术系统进化趋势

    技术系统进化趋势 技术系统及进化趋势S曲线法则技术系统的S曲线产品的进化曲线 八大技术系统进化法则 xff08 1 xff09 完备性法则 xff08 2 xff09 能量传递法则 xff08 3 xff09 协调性进化法则 xff08 4
  • 英特尔 NUC X15 笔记本 评测 英特尔上架新款 NUC X15 笔记本参数配置

    配置方面 xff0c 这款笔记本搭载了 i7 12700H 处理器 xff0c 14 核 20 线程 xff0c 睿频可达 4 7GHz 显卡为英特尔锐炫 A730M xff0c 搭载 24 个 Xe 内核 xff0c 拥有 12GB 19
  • vs2019未能正确加载解决方案的项目

    网上朋友们说是路径出了问题 xff0c 需要修改 vcxproj文件的内容 xff0c 我试了一下没成功 最后发现 xff0c 所以打不开 xff0c 是因为我下载了别人的项目 xff0c 用解压软件解压后直接打开了 sln 当我把解压后的
  • 自我提升解决bug的能力(一)

    我和大家分享一个我的自我提升解决bug的能力 满满的干货 一名优秀的程序员会具备较强解决bug的能力 如果你觉得自己不够优秀 xff0c 解决bug能力不足 xff0c 学习处于被动的状态 那我要大声的告诉你请不要迷茫 xff0c 陷入低沉
  • 论文笔记:VIBE: Video Inference for Human Body Pose and Shape Estimation

    要解决的问题 有3D关键点标注的数据集太少 xff0c 所以我们想生成这样的数据集 所以我们提出了一个 利用视频进行动作估计的新方法 xff0c 解决了数据集缺乏和预测准确率不佳的问题 主要创新点 利用 对抗式生成网络 来区分 真实人类动作
  • 2022年春招实习十四面(嵌入式面经)(已完结)

    文章目录 前言CVTE xff08 嵌入式软件 xff09 CVTE一面 xff08 嵌入式软件开发 xff09 时长 xff1a 50分钟CVTE二面 xff08 55分钟 xff09 阿里菜鸟网络 xff08 嵌入式软件 xff09 阿
  • 二分算法简单介绍

    二分算法 xff0c 顾名思义 就是把一组有序数据的搜索区域缩小一半 下面给大家举例说明一下 如何确定被缩小的搜索区间 原理分析 拿一个有序的整形数组来举例 int a 10 61 1 2 3 4 5 6 7 8 9 10 xff0c 在初
  • 论文投稿指南——中文核心期刊

    gt gt gt 深度学习Tricks xff0c 第一时间送达 lt lt lt 目录 xff08 一 xff09 国内三大核心 1 中文社会科学引文索引 xff08 CSSCI 南大核心 xff09 2 中国科学引文数据库 xff08
  • linux opendir(打开目录函数) readdir(读取目录函数) closedir(关闭目录函数)

    Linux下opendir readdir 和closedir 这三个函数主要用来遍历目录 在使用这三个函数前必须先包括以下两个头文件 xff1a include lt sys types h gt include lt dirent h
  • Cmakelists.txt 的基本框架

    执行 cmake 表示在当前目录下执行 cmake cmake 表示在前一级目录下执行 cmake make 在当前目录下执行 make 语法 1 设置 cmake 版本需求 cmake minimum required VERSION 2
  • UartAssist - 串口调试助手。

    由于项目需要用到串口 xff0c 所以我就找到一个简单易上手的串口调试助手 串口调试助手 1 助手界面 xff1a 2 设置串口 xff0c 点击 打开 3 设置发送区和接收区参数 4 输入发送内容 xff0c 点击 发送 即可
  • 网络摄像机rtsp地址详解。

    RTSP xff08 Real Time Streaming Protocol xff09 xff0c RFC2326 xff0c 实时流传输协议 xff0c 是TCP IP协议体系中的一个应用层协议 xff0c 由哥伦比亚大学 网景和Re
  • Qt 登陆界面实现

    简单的QT用户登录界面 一 项目描述 在登录界面输入用户名和密码正确之后才进入欢迎界面 用户名 xff1a xiaoxian 密码 xff1a 1240 二 效果图 三 源代码 loginform span class token punc
  • FFMPEG保存视频流数据至本地(rtsp转mp4)

    将rtsp流中的h264视频流在没解码之前获取下来 xff0c 并保存到本地文件mp4中的h264流中 xff0c h264 gt mp4 网络摄像机rtsp地址详解 流程图 xff1a 源码 xff1a span class token
  • Qt + FFmpeg实现播放器(FFmpeg可以解码的格式基本都可以播放)。

    一 开发环境的准备 Linux下移植ffmpeg开源库 二 代码实现播放功能 1 打开音视频流并获取音视频流信息 xff1b 2 查找视频流位置以及查找并打开视频解码器 xff1b 3 视频解码的同时处理图片像素数据 xff1b 4 最后要
  • SecureCRT 下的串口不能输入指令。

    1 在 SecureCRT 下的串口不能输入指令 解决方法 xff1a Session Options gt Connection gt Serial gt Flow Control xff0c 将原先默认选中的 RTS CTS取消掉即可
  • Qt实现简单密码登陆界面

    效果图 xff1a 代码实现 span class token macro property span class token directive hash span span class token directive keyword i
  • error: ‘uint8_t’,‘uint32_t’ does not name a type

    c 43 43 里用了c的代码 xff0c 确切的说 xff0c 是引用了c写的x264 h xff0c 结果报错了 xff1a 解决方法 xff1a span class token macro property span class t
  • gitlab 同时拉取整个项目

    一 xff1a 下载repo工具包 下载地址 xff1a GitHub NeutionWei repo unzip repo 刚下载的repo包解压 xff0c 其中的repo只是一个几百行的脚本 xff0c 需要repo init才可以获
  • CMakeLists.txt详解

    一 xff1a CMakeLists txt文件是cmake用来生成Makefile文件需要的一个描述编译链接的规则文件 学习cmake需要提前了解gcc等编译命令 xff0c 先来解释一条最简单的命令 gcc source c o bin