CMakeLists配置(常用的)

2023-05-16

一:最小组成

# cmake 最小版本需求
cmake_minimum_required(VERSION 2.8)

# project 名字
project(MyEsp32AllCode)

# 可执行文件生成
add_executable(${PROJECT_NAME} "main.c")

二:.h .c .cpp 文件添加

1:include_directories

提供了搜索头文件的根目录
例如:/home/xx/include/opencv/cv.h
可以在cmakelists.txt 中写上
include_directories(/home/xx/include)来让库文件搜索以/home/xx/include为基础
即可在main.c 函数上 添加 #include “opencv/cv.h" 来应用。

2:find_package()

例子1:(版本错误)

find_package(Boost 1.68.0 REQUIRED system coroutine thread)

输出

CMake Error at /usr/share/cmake-3.10/Modules/FindBoost.cmake:1947 (message):
  Unable to find the requested Boost libraries.

  Boost version: 1.65.1

  Boost include path: /usr/include

  Detected version of Boost is too old.  Requested version was 1.68 (or
  newer).
Call Stack (most recent call first):
  CMakeLists.txt:29 (find_package)


Configuring incomplete, errors occurred!

本地安装boost 版本 为1.65.1 修改为

find_package(Boost 1.65 REQUIRED system coroutine thread)
  • –>
Boost version: 1.65.1
Found the following Boost libraries:
  system
  coroutine
  thread
  context
  chrono
  date_time
  atomic

例子2:(找不到相应库)

find_package(eigen3 REQUIRED)

输出

CMake Error at CMakeLists.txt:44 (find_package):
  By not providing "Findeigen3.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "eigen3", but
  CMake did not find one.

  Could not find a package configuration file provided by "eigen3" with any
  of the following names:

    eigen3Config.cmake
    eigen3-config.cmake

  Add the installation prefix of "eigen3" to CMAKE_PREFIX_PATH or set
  "eigen3_DIR" to a directory containing one of the above files.  If "eigen3"
  provides a separate development package or SDK, be sure it has been
  installed.


Configuring incomplete, errors occurred!

其中 eigen3 应该写成Eigen3

find_package(Eigen3 REQUIRED)
message("${EIGEN3_INCLUDE_DIR}")
include_directories( EIGEN3_INCLUDE_DIR )

–>

/usr/include/eigen3
  • 分析
xx@ubuntu:/usr/lib/cmake/eigen3$ tree
.
├── Eigen3Config.cmake
├── Eigen3ConfigVersion.cmake
├── Eigen3Targets.cmake
└── UseEigen3.cmake

可见Eigen被正确安装,且提供了find_package查找方式。

  • 2.1:find_package检索路径

三:变量

变量不需要声明, 有两种形式${variable} 和 variable, 前者是值引用,比较常见,后者直接引用,一般只用在赋值和条件判断中才会使用。

  • 赋值:set(variable arg1 arg2 arg3 …)

1:自定义变量

2:内置变量

不动变量:

  1. CMAKE_SOURCE_DIR : 指定了CMakeLists.txt所在的目录
  2. PROJECT_SOURCE_DIR:指向构建工程的全路径

可以修改变量:
1)CMAKE_LIBRARY_OUTPUT_DIRECTORY :指定了cmake编译输出的东西应该放在什么地方
2)CMAKE_ARCHIVE_OUTPUT_DIRECTORY:

#set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

##:将build产生的exe文件和lib文件放到指定的目录中


四:头文件

五:库

六:常用

1: message :

  • 例子:
message(FATAL_ERROR, "Fatal: this's fatal error")
message(WARNING, "Warn: this's warn msg")
message(STATUS, "Status: this's status msg")
message("This is message")
  • 输出:(一般会用不同的颜色显示 比如在cmake-gui下 红色字体显示)
FATAL_ERROR,Fatal: this's fatal error
WARNING,Warn: this's warn msg
STATUS,Status: this's status msg
This is message

2:多行注释

  • 语法格式
 // *#[=*[注释内容]=*]*

备注:其中*号表示0个或者多个=,当然左边=号的数量要等于右边=的数量

  • 例子
#[[这是多行注释!
这是多行注释!
这是多行注释!]]

七:语法

1:命令调用的参数

  • 1.1: Bracket Argument
    – 以[=*[]=*]封闭参数内容, 其中*号表示0个或者多个=
    – 当然左边=号的数量要等于右边=的数量
    – 内容可以包含[/]

  • 例子

message([=[
This is the first line in a bracket argument with bracket length 1.
No \-escape sequences or ${variable} references are evaluated.
and can include [ content ] .
This is always one argument even though it contains a ; character.
The text does not end on a closing bracket of length 0 like .
It does end in a closing bracket of length 1.
]=])
  • 输出
This is the first line in a bracket argument with bracket length 1.
No \-escape sequences or ${variable} references are evaluated.
and can include [ content ] .
This is always one argument even though it contains a ; character.
The text does not end on a closing bracket of length 0 like .
It does end in a closing bracket of length 1.

  • 1.2: Quoted Argument
    – 使用双引号""来封闭参数内容
    – 参数中不能包含"\, 可以使用\进行转移
    – 参数中的${variable}会被替换成相应的值
    – 如果一行写不下,可以用\ 进行换行
  • 例子
message("This is a quoted argument containing multiple lines. \
This is always one argument even though it contains a ; character.
Both \\-escape sequences and ${variable} references are evaluated.
The text does not end on an escaped double-quote like \".
It does end in an unescaped double quote.
")
  • 输出
This is a quoted argument containing multiple lines. This is always one argument even though it contains a ; character.
Both \-escape sequences and  references are evaluated.
The text does not end on an escaped double-quote like ".
It does end in an unescaped double quote.
  • 1.3: Unquoted Argument
    – 不使用任何符号封闭参数内容;
    – 参数中不可以包含空格()#” 、,但可以用\转义;
    会将参数内容分割成多个参数,可以用\,可以用\进行转义;
  • 例子
foreach(arg
    NoSpace
    Escaped\ Space
    This;Divides;Into;Five;Arguments
    Escaped\;Semicolon
    )
  message("${arg}")
endforeach()
  • 输出
NoSpace
Escaped Space
This
Divides
Into
Five
Arguments
Escaped;Semicolon

2:注释

  • 2.1:单行注释
# 单行注释
  • 2.2: 多行注释
    备注:可以放在代码中间
#[[This is a bracket comment.
It runs until the close bracket.]]
message("First Argument\n" #[[Bracket Comment]] "Second Argument")

3: 流程控制

  • 3.1: 条件控制
if(expression)
  # then section.
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  #...
elseif(expression2)
  # elseif section.
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  #...
else(expression)
  # else section.
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  #...
endif(expression)

//TODO

if(<constant>)
为true的constant:1, YES, ON, TRUE, Y, 或者非0数字;
为false的constant:0, NO, OFF, FALSE, N, IGNORE, NOTFOUND, 空字符串, 或者以-NOTFOUND为后缀的变量;
以上常量大小写不限;
if(variable | string)
variable被定义为非false的常量时为true,否则为false;
逻辑运算: NOT, AND, OR;
if(COMMAND command-name)
判断给定的名称是一个可以被调用的命令、宏或者函数;
if(TARGET target-name)
判断是否是一个已经(在子目录中)调用add_library, add_executable, add_custom_target生成的目标;
...
  • 3.2: 循环控制
    //TODO
foreach(loop_var arg1 arg2 ...)
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  ...
endforeach(loop_var)
对每个参数进行迭代
foreach(loop_var RANGE total)
foreach(loop_var RANGE start stop [step])
迭代生成的数字范围
例:

set(src_list a.c b.c d.c)
foreach(src ${src_list})
    message(${src})
endforeach()

#生成从0到100的数字
foreach(num RANGE 100)
    message(${num})
endforeach()

#生成从2到100的数字,间隔为2
foreach(num RANGE 2 100 2)
    message(${num})
endforeach()

4:命令定义

  • 4.1: 宏
    //TODO
macro(<name> [arg1 [arg2 [arg3 ...]]])
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  ...
endmacro(<name>)
例:

# 求和
macro(sum out)
    set(ret 0)
    foreach(var ${ARGN})
        math(EXPR ret "${ret}+${var}")
    endforeach()
    set(out ${ret})
endmacro()
sum(outRet 1 2 3 4 5)
message(${outRet})
使用${ARGC}获取传入的参数的数量;
使用${ARGV}获取传入的所有参数列表;
使用${ARGN}获取期望的参数列表(除去在定义宏时指定的参数列表)
使用${ARGV#}获取指定的参数,其中#为从0到${ARGC}的值,超出范围,行为未定义;
  • 4.2: 函数
    //TODO
function(<name> [arg1 [arg2 [arg3 ...]]])
  COMMAND1(ARGS ...)
  COMMAND2(ARGS ...)
  ...
endfunction(<name>)
宏内部的变量在外部是可以访问的,而函数内部的变量则不行

其他

1:判断系统

IF(UNIX)
  MESSAGE("UNIX:" ${UNIX})
ENDIF()

IF(WIN32)
  ADD_DEFINITIONS(-D_CRT_SECURE_NO_DEPRECATE -DWIN32_LEAN_AND_MEAN -MD)
ELSEIF(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
  ADD_DEFINITIONS(-DOSX)
ENDIF()

2:时间版本

备注:与cmake版本有关(低版本不支持,比如2.8.7 ,应该2.8.11以上,没验证)

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

CMakeLists配置(常用的) 的相关文章

  • CMakeLists.txt 语法介绍与实例演练

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

    PX4 CMakeLists txt 文件剖析 前面对于 PX4 的 Makefile 已经做了比较详细的分析 见这里 这里进一步对 PX4 的 CMakeLists txt 文件结构进行进一步的分析 1 CMake 简述 CMake 是一
  • ROS CMakeLists 写法

    SET CMAKE BUILD TYPE 34 Debug 34 SET CMAKE CXX FLAGS DEBUG 34 ENV CXXFLAGS O0 Wall g ggdb 34 SET CMAKE CXX FLAGS RELEASE
  • CMakeLists Option使用简介

    CMakeLists Option使用简介 1 基本格式2 示例3 基本用法4 C程序条件编译5 次项目之间选项的关系 Reference xff1a CMake之Option使用简介 CMake中的option用于控制编译流程 xff0c
  • CMakeLists笔记

    CMakeLists笔记 一 路径名二 函数三 常用 一 路径名 PROJECT SOURCE DIR xff1a 一般为catkin ws src xff0c 是cmakelists的绝对路径PROJECT BINARY DIR xff1
  • CMakeLists.txt书写规则记录

    编写自己的CMakeLists txt 1 一个CMakeLists txt的基本内容2 项目包含多个文件或文件夹时添加方式3 添加链接库 1 一个CMakeLists txt的基本内容 span class token comment 编
  • ROS Catkin 教程之 CMakeLists.txt

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

    注 xff1a 尽量使用ament cmake auto来编写cmakelists txt文件 xff0c 依赖的程序包在packages xml文件中用 lt depend gt nav msgs lt depend gt 的形式声明 x
  • CMakeLists

    1 指定 cmake 的最小版本 cmake minimum required VERSION 3 4 1 2 设置项目名称 xff0c 它会引入两个变量 demo BINARY DIR 和 demo SOURCE DIR xff0c 同时
  • CMakeLists.txt 语法介绍与实例演练

    一 Cmake 简介 cmake 是一个跨平台 开源的构建系统 它是一个集软件构建 测试 打包于一身的软件 它使用与平台和编译器独立的配置文件来对软件编译过程进行控制 二 常用命令 1 指定 cmake 的最小版本 cmake minimu
  • 2022-12-18 CMakelists指定CMAKE_BUILD_TYPE为Debug或者Release

    今天编译代码的时候遇到古怪的事情 xff0c 在Cmakelists txt中指定了编译版本 xff0c build的时候输出一句 xff1a cpptools The build configurations generated do n
  • PX4 CMakeLists.txt分析

    简单的概述 make 和 cmake 是linux UNIX系统下广泛使用的构建编译规则工具 xff0c 面对复杂庞大的工程 xff0c 各种源文件和工具文件分布在工程目录下 xff0c 如何组织和有序地编译和使用这些文件 xff0c 显然
  • [ROS](03)CMakeLists.txt详解

    文章只是个人学习过程中学习笔记 xff0c 主要参考ROS教程1 目录 1 概述2 CMakeLists txt文件2 1 遵循的格式和顺序2 2 文件解析2 3 find package 2 4 catkin package 1 概述 C
  • C++工程的CMakeLists.txt文件编写

    最简单的demo工程如下 xff1a include lt iostream gt include lt string gt int main int argc char argv std cout lt lt 34 hello world
  • CMakeLists.txt的编写

    首先是编写好的CMakeLists txt文件 span class token function cmake minimum required span span class token punctuation span VERSION
  • CMakeLists和makefile文件编写

    1 CMakeLists和makefile区别 xff1a CMake是一个跨平台的软件 xff0c 在很多平台可以使用 一般在windows下 xff0c 我们会直接使用VS生成项目 xff0c 在Linux下面 xff0c 我们也可以使
  • QT中CMakeLists添加第三方库

    1 新建项目 xff0c 打开CMakeLists txt文件 cmake minimum required VERSION 2 8 project fp test cm 括号内fp test cm为项目名称 add executable
  • 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
  • NDK--CMakeLists配置第三方so库

    当我们创建一个NDK工程时 xff0c 会自动创建一个CMakeLists txt的文件 xff0c 在AS中c 43 43 的编译器是使用LLVM xff0c 规则为cmake xff0c 今天来学习下cmake的基本套路 首先 xff0
  • Cmakelists.txt添加.h和.cpp文件

    文件目录结构是这样 代码都是最基本的代码 仅仅是个小的demo cmakelists txt里面的内容 span class token comment cmake的版本要求 span cmake minimum required span

随机推荐

  • TCP/IP协议栈之LwIP-pbuf

    pbuf结构体就是一个描述协议栈中数据包的数据结构 xff1a Main packet buffer struct struct pbuf next pbuf in singly linked pbuf chain struct pbuf
  • Linux使用wpa_supplicant手动配置连接WiFi

    wpa supplicant是Linux BSD Mac OSX和Windows的WPA的服务 支持WPA和WPA2 IEEE 802 11i RSN xff0c 它适用于台式机 笔记本和嵌入式系统 xff0c Supplicant是在客户
  • 使用python快速将主机字节序转为网络字节序

    1 进入python环境 这里以win10自带的wsl win10子系统为操作环境进入Python命令行 2 引入网络字节序标准库 这里使用Python自带的socket库 3 将待转换的主机数据使用socket htons 或者socke
  • ∏这个是什么符号?

    是各项连乘的运算符号 读大写的 xff08 pai xff09 例如 xff1a i 61 1 xff08 符号下面 xff09 n xff08 符号上面 xff09 ai 符号右面 表示a1 a2 an 符号下面表示右面式子可变参量的下限
  • python获取图片的颜色信息

    span class pun style font family none font size 14px span h1 style font family none font size 24px padding 5px margin 5p
  • Python:TypeError: 'int' object is not callable

    一个函数的部分代码如下 xff1a python view plain copy def loadData len 61 dataSet len trainingSet extend dataSet len 3 4 testSet exte
  • FreeRTOS — 消息队列

    以下内容转载自安富莱电子 xff1a http forum armfly com forum php FreeRTOS 的一个重要的通信机制 消息队列 xff0c 消息队列在实际项目中应用较多 1 消息队列 1 1 消息队列的概念及其作用
  • 学校人力资源管理系统——物理结构设计

    新 建学校人力资源管理系统 数据库 1 创建相关表 1 1 创建部门信息表 部门信息表的创建代码如下 xff0c 部门信息表在SQL中的信息显示如图6 1所示 create table 部门信息表 部门编号 char 6 not null
  • python 安装serial模块

    想用Python来实现对串口的控制 xff0c 写好了脚本 xff0c 现在将这个脚本拿到另外一个电脑上去运行 xff1b 运行时提示错误 xff0c 说是没有安装serial模块 xff0c 于是乎安装 pip install seria
  • Doxygen使用教程(个人总结)

    简介Doxygen 一 xff0e 什么是Doxygen Doxygen 是一个程序的文件产生工具 xff0c 可将程序中的特定批注转换成为说明文件 通常我们在写程序时 xff0c 或多或少都会写上批注 xff0c 但是对于其它人而言 xf
  • STM32F401 I2S(full duplex)全双工示例代码

    USER CODE BEGIN Header 64 file main c 64 brief Main program body This notice applies to any and all portions of this fil
  • 一、认识与学习Linux中的BASH 之 1.1 什么是bash

    1 1 什么是bash 1 1 1 什么是bash bash全称为The Bourne Again shell xff0c 是Bourne Shell的扩展 xff0c 是基于GUN构架发展出来的语言 xff0c 有很灵活和强大的编程接口
  • 阿里云ECS服务器环境搭建(1) —— ubuntu 16.04 图形界面的安装

    阿里云ECS服务器环境搭建 xff08 1 xff09 ubuntu 16 04 图形界面的安装 1 背景 在我们购买阿里云ECS服务器之后 xff0c 默认的系统环境是很干净的 xff0c 我购买的是ubuntu16 04 xff0c 远
  • Python+pandas+每天股票涨了多少

    第一步 xff1a 得到某支股票历年来的交易数据 方法见 xff1a https blog csdn net zwy 0309 article details 108217342 在此 xff0c 我使用以下脚本得到股票 xff08 代码
  • 2021-06-02

    在ROS中仿真模型中添加gps传感器 获取gps传感器模型包为自己的机器人添加gps传感器将gps之中的经度纬度坐标转化为自己地图中的坐标 1 获取gps传感器模型包 link http wiki ros org hector gazebo
  • Dockerfile如何编写(指令详解)

    本文个人博客地址 xff1a https www leafage top posts detail 21525V8AP Dockerfile Dockerfile 描述了组装镜像的步骤 xff0c 其中每条指令都是单独执行的 除了FROM指
  • 关于Home Lab的搭建——硬件选择篇(迷你主机)(一)

    关于Home Lab 这个名词出自哪里 xff0c 我也不清楚 不过 xff0c 可以这样来理解Home Lab xff0c Home Lab是一台作为实验使用的电脑 xff0c 试验的内容多数是关于计算机网络的搭建 系统安装 测试 xff
  • Adaboost基本二分类算法

    最早类型的Adaboost是由Yoav Freund和Robert E Schapire提出的 xff0c 一种用于二分类的boosting集成学习方法 也是李航 统计学习方法 中所介绍的Adaboost 它将一系列弱分类器的线性组合 xf
  • Springboot 项目金蝶中间件AAS-9.0启动报错 javax.persistence.Table.indexes()[Ljavax/persistence/Index 问题解决

    Springboot 项目金蝶中间件AAS 9 0启动报错 java lang NoSuchMethodError javax persistence Table indexes Ljavax persistence Index问题解决方法
  • CMakeLists配置(常用的)

    一 xff1a 最小组成 cmake 最小版本需求 cmake minimum required VERSION 2 8 project 名字 project MyEsp32AllCode 可执行文件生成 add executable PR