CMakeLists文件的编译

2023-05-16

文章目录

  • CMakeLists的编译
    • CMakeLists编译原理
      • **文件路径:**
      • **编写CMakeLists.txt**
      • CMakeLists常用命令
    • CmkeLists的基本步骤
        • 1.1 CMake版本
        • 1.2 软件包名称
        • 1.3 查找相关的CMake包
        • 1.4 设置配置环境
        • 1.5 **指定头文件目录**
        • 1.6 可执行目标
      • Qt CMakeLists使用案例

CMakeLists的编译

参考链接

CMakeLists编译原理

​ CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object))。因此CMake的编译基本就两个步骤:

1. cmake
2. make

cmake 指向CMakeLists.txt所在的目录,例如cmake … 表示CMakeLists.txt在当前目录的上一级目录。cmake后会生成很多编译的中间文件以及makefile文件,所以一般建议新建一个新的目录,专门用来编译,例如

mkdir build
cd build
cmake ..
make

make根据生成makefile文件,编译程序。

文件路径:

.
├── build
├── CMakeLists.txt
├── include
│   └── b.h
└── src
    ├── b.c
    └── main.c

编写CMakeLists.txt

 1 #1.cmake verson,指定cmake版本 
 2 cmake_minimum_required(VERSION 3.2)
 3 
 4 #2.project name,指定项目的名称,一般和项目的文件夹名称对应
 5 PROJECT(test_sqrt)
 6 
 7 #3.head file path,头文件目录
 8 INCLUDE_DIRECTORIES(
 9 include
10 )
11 
12 #4.source directory,源文件目录
13 AUX_SOURCE_DIRECTORY(src DIR_SRCS)
14 
15 #5.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
16 SET(TEST_MATH
17 ${DIR_SRCS}
18 )
19 
20 #6.add executable file,添加要编译的可执行文件
21 ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH})
22 
23 #7.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),就添加该库的名称
24 TARGET_LINK_LIBRARIES(${PROJECT_NAME} m)

编译完成结果

├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   │   ├── 3.2.2
│   │   │   ├── CMakeCCompiler.cmake
│   │   │   ├── CMakeCXXCompiler.cmake
│   │   │   ├── CMakeDetermineCompilerABI_C.bin
│   │   │   ├── CMakeDetermineCompilerABI_CXX.bin
│   │   │   ├── CMakeSystem.cmake
│   │   │   ├── CompilerIdC
│   │   │   │   ├── a.out
│   │   │   │   └── CMakeCCompilerId.c
│   │   │   └── CompilerIdCXX
│   │   │       ├── a.out
│   │   │       └── CMakeCXXCompilerId.cpp
│   │   ├── cmake.check_cache
│   │   ├── CMakeDirectoryInformation.cmake
│   │   ├── CMakeOutput.log
│   │   ├── CMakeTmp
│   │   ├── feature_tests.bin
│   │   ├── feature_tests.c
│   │   ├── feature_tests.cxx
│   │   ├── Makefile2
│   │   ├── Makefile.cmake
│   │   ├── progress.marks
│   │   ├── TargetDirectories.txt
│   │   └── test_sqrt.dir
│   │       ├── build.make
│   │       ├── C.includecache
│   │       ├── cmake_clean.cmake
│   │       ├── DependInfo.cmake
│   │       ├── depend.internal
│   │       ├── depend.make
│   │       ├── flags.make
│   │       ├── link.txt
│   │       ├── progress.make
│   │       └── src
│   │           ├── b.c.o
│   │           └── main.c.o
│   ├── cmake_install.cmake
│   ├── Makefile
│   └── test_sqrt
├── CMakeLists.txt
├── include
│   └── b.h
└── src
    ├── b.c
    └── main.c

CMakeLists常用命令

cmake_minimum_required

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vBrWIaj5-1635406583475)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211028150640409.png)]

cmake_minimum_required(VERSION 3.14)

**project命令:**用于指定项目的名称

project(BVTest)

**aux_source_directory: ** 将dir目录下的所有源文件的名字保存在变量中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wuftJoLz-1635406583477)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211028150850892.png)]

AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src SRC_List)  //将src下的文件都保存在SRC_List下

**add_executable: **用于指定从源文件中编译出一个可执行文件并且命名为name

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tveDn9vY-1635406583480)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211028151036811.png)]

ADD_EXECUTABLE(${PROJECT_NAME} ${DIR_SRCS})

**add_library: ** 用于从指定源文件中编译出一个lib,命名为name

add_library(Lib ${DIR_SRCS})

**target_link_libraries: ** 添加可执行文件所需要的库

target_link_libraries(${PROJECT_NAME} Qt5::Core Qt5::Xml Qt5::SerialPort ${OpenCV_LIBS})

**set : **用于设置变量

set(Qt5 DIR D:/Qt5/5.12.6/..)

**unset : **用于移除变量

unset(VAR CACHE)  //移除CACHE

**message : **输出信息

message("hello world")

**include_directories : **设置头文件目录

include_directories(${PROJECT_SOURCE_DIR}/lib)

find_path : 用于查找路径,保存在var

find_path(<var> name1[path1..])

find_library : 用于查找lib,保存在var

find_library(<var> name1[path1..])

**find_package :**寻找包

find_package(Qt5 REQUIRED COMPONENTS Core Widgets  Sql Xml Charts SerialPort)

**file : **提供了丰富的目录和文件的操作

file(GLOB_RECURSE HDRS include/.*h)
file(GLOB_RECURSE SRCS src/*.cpp)

CmkeLists的基本步骤

my_add_executable(${PROJECT_NAME} main.cpp ${SRCS} ${HDRS} )

生成可执行文件 注意顺序,不然会有link错误,或未定义的声明

把当前工程目录下的 src 目录的下的所有 .cpp 和 .c 文件赋值给 SRC_LIST

AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR}/src  SRC_LIST)

指定头文件目录

INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)

。。。。。

生成可执行文件 注意顺序,不然会有link错误,或未定义的声明

ADD_EXECUTABLE(CMakeFF ./src/ffplay.c ./src/cmdutils.c main.c)

1.1 CMake版本

每个catkin CMakeList.txt文件都必须以需要的CMake版本。

cmake_minimum_required(VERSION 3.14)

1.2 软件包名称

由CMake项目功能指定的包的名称。这里我们制作一个名为robot_brain的软件包。

    project(robot_brain)

1.3 查找相关的CMake包

我们需要使用find_package函数来制定需要找到哪些其他的CMake包来构建我们的项目

    find_package(catkin REQUIRED)

对于find_package来说,有两种不同的表达方式分别为:

    find_package(catkin REQUIRE COMPONENTS nodelet)

或者

    find_package(catkin REQUIRE)

    find_package(nodelet REQUIRE)

对于两者的区别。如果通过了find_package找到了一个包,会创建几个提供有关找到的包的消息的Cmake环境变量。

这些环境变量导出了头文件的位置,源文件的位置,包所依赖的库以及这些库的地址。

<NAME>_FOUND-如果找到库,则设置为true,否则为false

<NAME>_INCLUDE_DIR/_INCLUDE-包导出的路径

<NAME>_LIBRARIES/_LIBS-包导出的库

如果find_package作为catkin的组件(例如第一种方式),这是有好处的。

    find_package(catkin REQUIRE COMPONENTS nodelet)   

这意味着由nodelet导出的include路径,库等也附加到了catkin_变量,这里的变量是上面指示的<NAME>_,反之使用方式二,则路径,库等不会被添加到catkin_变量中。

1.4 设置配置环境

//设置Qt路径
set(Qt5 DIR D:/Qt5.12.6/5.12.6/msvc2015_64/lib/cmake/Qt5/)		//.cmake..
//设置opencv路径
set(OpenCV DIR D:/opencv/cv/opencv/build/)

1.5 指定头文件目录

INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)

include_directories(${OpenCV_INCLUDE_DIRS})
INCLUDE_DIRECTORIES(./include)
include_directories(./lib)

1.6 可执行目标

要指定可执行目标,我们必须使用add_executable()CMake函数

add_executable(myProgram src/main.cpp  src/some_file.cpp  src/another_file.cpp)

这将构建一个名为myProgram的目标可执行文件,由后面的三个源文件构成。

Qt CMakeLists使用案例

cmake_minimum_required(VERSION 3.14)
project(BinocularCamera)

set(Qt5_DIR D:/Qt5.12.6/5.12.6/msvc2015_64/lib/cmake/Qt5/)
set(OpenCV_DIR D:/opencv/cv/opencv/build/)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOUIC_SEARCH_PATHS ./FormFile/)
set(CMAKE_AUTOMOC ON)


#设置工程目录为当前路径
SET(CMAKE_INCLUDE_CURRENT_DIR ON)

function(assign_source_group)
    foreach (_source IN ITEMS ${ARGN})
        if (IS_ABSOLUTE "${_source}")
            file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}")
        else ()
            set(_source_rel "${_source}")
        endif ()
        get_filename_component(_source_path "${_source_rel}" PATH)
        string(REPLACE "/" "\\" _source_path_msvc "${_source_path}")
        source_group("${_source_path_msvc}" FILES "${_source}")
    endforeach ()
endfunction(assign_source_group)

function(my_add_executable)
    foreach (_source IN ITEMS ${ARGN})
        assign_source_group(${_source})
    endforeach ()
    add_executable(${ARGV})
endfunction(my_add_executable)


find_package(OpenCV REQUIRED)
find_package(Qt5 REQUIRED COMPONENTS Core Widgets  Sql Xml Charts SerialPort )


file(GLOB_RECURSE HDRS include/*.h)
file(GLOB_RECURSE SRCS src/*.cpp)
file(GLOB PREHEADER stdafx.h)

FILE(GLOB UI_FILES "FormFile/*.ui")
QT5_WRAP_UI(PROJECT_UIS_H ${UI_FILES})

include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(./thirdparty/include)
link_directories(./thirdParty/lib)
include_directories(.)


my_add_executable(${PROJECT_NAME} main.cpp ${SRCS} ${HDRS}  ${PROJECT_UIS_H} )
#ADD_LIBRARY(${PROJECT_NAME} SHARED  ${SRCS} ${HDRS})
target_link_libraries(${PROJECT_NAME}   Qt5::Core  Qt5::Xml Qt5::Sql Qt5::Widgets Qt5::Charts ${OpenCV_LIBS}       
      setupapi  CameraDevices Qt5::SerialPort  )
#控制台窗口隐掉
#Set_Target_Properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS_RELEASE "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMakeLists文件的编译 的相关文章

  • PX4源码中CMakeLists.txt文件的相关含义

    在px4每个模块中 xff0c 都会引用到CMakeLists txt文件 比如 代码 px4 add module MODULE modules attitude estimator q MAIN attitude estimator q
  • 【CMAKE系列】cmake中CMakeLists.txt脚本的常用语法

    在不同的平台编译的时候 xff0c 会用到一些系统内置的变量 xff0c 比如操作系统名称 xff0c 版本号之类 xff1a CMAKE SYSTEM xff1a 系統全名 xff0c 如 Linux 2 4 22 xff0c FreeB
  • Cmake以及CmakeLists

    CMake使用 CMake1 gcc make和CMake的关系2 CMake一般使用流程2 1 生成构建系统2 2 执行构建 xff08 比如make xff09 xff0c 生成目标文件 xff1b 2 3 执行测试 安装或打包 3 C
  • CMake中CMakeLists文件的编写以及变量打印

    最近在学习PCL xff0c 在Win10下使用VS编写PCL程序 xff0c 配置环境时经常出错 xff0c 踩坑记录详见 xff1a Win10 43 VS2017 43 PCL 1 8 1软件安装 踩坑记录 看到 点云库PCL从入门到
  • Record: My CMakeLists

    1 设置需要的最小版本的cmake cmake minimum required VERSION 3 10 2 定义生成的项目名 project perceive tracking 3 1 设置cmake参数 set CMAKE CXX F
  • CMakeLists.txt详解

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

    边学边看 xff0c 学到什么分享什么 CMakeLists txt 构建配置文件package xml 功能包配置文件 上面的意思个人理解就是功能包本身如果要在别处运行 xff0c 需要什么样的条件在xml文件中看 功能包自身 xff0c
  • 探讨ros下的cmakelists文件的编写

    文章目录 cmakelists文件整体架构分块讲解1 CMake版本2 软件包名称3 查找相关的CMake包4 消息 服务 动作生成器 cmakelists文件整体架构 所需CMake版本 xff08 cmake minimum requi
  • 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中的CMakeLists.txt?

    您的CMakeLists txt文件必须遵循此格式 xff0c 否则您的软件包将无法正确构建 配置中的顺序很重要 Required CMake Version cmake minimum required Package Name proj
  • 3.编写CMakeLists文件

    本章将介绍为您的软件编写有效的 CMakeLists 文件的基础知识 它将涵盖处理大多数项目所需的基本命令和问题 虽然 CMake 可以处理极其复杂的项目 xff0c 但对于大多数项目 xff0c 你会发现本章的内容会告诉你所有你需要知道的
  • ros下package中CMakelists的编写

    目录 一 package自动生成的Cmakelists1 指定cmake版本2 项目名字3 寻找构建所需依赖包4 启用python模块依赖5 Message Service Action 生成文件6 启动 message services
  • CMakeLIsts.txt与Makefile的区别

    CMake是一个跨平台的安装 编译 工具 可以用简单的语句来描述所有平台的安装 编译过程 他能够输出各种各样的makefile或者project文件 能测试编译器所支持的C 43 43 特性 类似UNIX下的automake CMake 使
  • ROS中的CMakeLists.txt

    在 ROS的编程过程中 xff0c 如果 CMakeLists txt如果写不好 xff0c 编译就很难成功 如果看不懂 CMakeLists txt那么很多错误你也不知道时什么回事 所以深入了解它是很右必要的 现在我们就来看看它 我们使用
  • ORB_SLAM2 CMakeLIsts文件注释

    最近在学习ORB SLAM 发现基本找不到CMakeLists的代码注释 就决定自己注释一份 如果发现有问题的地方 欢迎和我交流 span class token function cmake minimum required span s
  • CMakeLists中的add_definitions()函数

    CMakeLists中的add definitions函数 0 引言1 add definitions 2 应用 0 引言 其实这个函数在安装一些库的时候 xff0c 它的CMakeLists里面就有这样的函数 典型的就是opencv了 o
  • cmake与make的区别及CMakeLists.txt文件编写

    一 cmake与make的区别 make工具是一个自动化编译工具 xff0c 它会根据Makefile中的规则进行批处理编译 当需要编译的文件较多时 xff0c 使用make工具会大大提高效率 但是 xff0c 当项目较大时 xff0c 编
  • CMakeList实战

    1 FIND PACKAGE FIND PACKAGE
  • Android Studio3.4.2新建C++项目,CMakeLists批量添加代码编译不过的坑

    上段时间升级了AS到3 4 2 最后新建了个C 的项目 然后生成的那个native lib cpp文件就可以编译 但是我的项目里 C 代码文件非常多 显然一个一个地添加太慢了 然后就想批量添加进去 但总是编译不过 真是orz 像上图这样 批

随机推荐

  • Spring Aop的使用(含示例)

    介绍 在软件业 xff0c AOP为Aspect Oriented Programming的缩写 xff0c 意为 xff1a 面向切面编程 xff0c 通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术 AOP是OOP的延续
  • 超好用的开发工具-VScode插件EIDE

    EIDE介绍 一款适用于8051 STM8 Cortex M RSCv的单片机开发环境 在 vscode上提供8051 xff0c STM8 Cortex M xff0c RISC V 项目的开发编译烧录等功能 使用文档 xff1a 简介
  • 直流编码电机双闭环(速度+角度)控制

    目录 1 PID框图 2 pid控制器的表达式 3 传感器数据获取 4 硬件设计 5 工程配置 6 软件部分程序配置 7 调参过程记录 本文已更新 xff0c 加上曲线调试 xff0c 更好效果 xff0c 更多内容 xff0c 详情 xf
  • OPENMV配置记录(一)

    文章目录 1 刷写固件2 开始配置openmv3 图像获取与显示4 修改图像 xff0c 获取像素 xff0c 添加元素5 使用图像进行基本操作 颜色追踪6 xff0c 识别码7 模版匹配8 通过比例的方法来求解距离9 组合使用 正好回家带
  • 为什么你的软件编译时没问题,运行时却出错?—— Java 中的异常再复盘

    从开发工具谈起 xff1a 这是我平常用的几个编辑器 记得我刚开始学 C 语言 xff0c 学 Java 的时候 xff0c 还是用 Notepad 43 43 这种文本编辑器写代码 xff0c 老师说是为了打基础 xff0c 加深记忆 后
  • 使用stm32解析富斯i6接收机(IBUS)

    文章目录 1 通信协议解析说明2 驱动程序设计3 实测4 使用串口空闲中断 43 DMA接收5 源码 1 通信协议解析说明 常见的官方遥控器大概如下所示 xff1a 常用的搭配接收机 xff1a 这里需要注意的是 xff1a i6是可以刷十
  • 编码电机PID调试(速度环|位置环|跟随)

    文章目录 1 编码电机认识2 上位机波形显示1 功能介绍2 协议说明 3 速度环调试验证4 位置环调试验证5 实现跟随效果 前面的文章中有讲过编码电机串级PID相关的知识 xff0c 以及一些PID的调试经验 xff0c 这里我最近正好又把
  • 树莓派安装ubuntu mate记录

    文章目录 1 系统下载1 ubuntu下载2 ubuntu mate下载 2 系统安装3 系统使用1 ubuntu系统2 ubuntu mate系统 这个算个失败的记录贴吧 xff0c 这个系统安装过程不太流畅 xff0c 使用起来也有很多
  • 平衡小车的一些常见问题总结

    文章目录 1 基本理论2 直立环速度环串级pid3 代码差异的解释4 转向环 1 基本理论 PID控制 pid控制值对偏差进行比例 xff0c 积分和微分的控制 xff0c 分别是三个部分 xff0c 对应为比例单元 xff0c 积分单元和
  • Ubuntu下tar命令使用详解 .tar解压、.tar压缩

    1 tar参数选项2 tar压缩命令3 tar解压缩命令4 解压安装5 tar bz2解压缩命令6 Linux压缩和解压 bz2文件 bzip2 Linux tar 命令 在Linux平台 xff0c tar是主要的打包工具 tar命令通常
  • 裸机开发之驱动开发

    一 驱动开发的基础理解 在计算中 xff0c 设备驱动程序是一种计算机程序 xff0c 用于操作或控制连接到计算机的特定类型的设备 驱动程序提供了与硬件设备的软件接口 xff0c 使操作系统和其他计算机程序可以访问硬件功能 xff0c 而无
  • STM32HAL库使用ESP8266模块

    ESP8266模块是一个可是实现蓝牙和WiFi一体的模块 xff0c ESP8266 是一个完整且自成体系的 WiFi 网络解决方案 xff0c 能够独立运行 xff0c 也可以作为 slave 搭载于其他 Host 运行 ESP8266模
  • 几种数字传感器介绍(一)————温湿度传感器(HDC1080)

    一 温湿度采集传感器 xff08 HDC1080 xff09 1 简要概述 HDC1080是一种集成温度传感器的数字湿度传感器 xff0c 具有出色的测量精度和超低的功耗 其具有14位测量分辨率 xff0c 相对湿度精度为 2 温度精度为
  • STM32F103xx / STM32F429VET6最小系统原理图

    STM32F429VET6核心板原理图 一 前言 先前使用过的是STM32F1系列 xff0c 只使用和绘制过STM32F103C8T6和STM32F103ZET6的板子 心血来潮想试一下STM32F4系列和F1系列在编程上有什么差别 xf
  • FreeRTOS - 多任务使用要点

    一 临界段应用 1 临界段作用 在程序访问资源时 xff0c 不希望被其他任务或者中断打断 xff0c 这段要执行的代码 xff0c 称为临界代码段 1 1不想被打断访问的资源 xff08 临界段保护 xff09 读取或者修改变量 xff0
  • 项目准备及自我介绍

    项目准备及自我介绍 1 自我介绍 面试官你好 xff0c 我叫XXX xff0c 就读于重庆邮电大学 xff1b 实验室是国家信息无障碍研发中心 xff1b 研究生期间 xff0c 参与两起机器人项目 xff0c 一是基于SLAM的清洁机器
  • 卸载重装Android Studio导入先前的版本,或者是误判SDK installed解决方法。(包含window,mac,Linux)

    我安装了几次Android Studio 之前一直不太稳定 xff0c 特别是想要导入别人的项目时 xff0c 版本不兼容真的会导致很多问题 尤其是他会下载gradle版本 xff0c 花费很长时间占用内存也就罢了 xff0c 更过分的是如
  • gcc编译过程

    gcc编译过程 文章目录 gcc编译过程1 预处理 Preproceessing 2 编译 Compilation 3 汇编 Assembly 4 链接 Linking 一般在windows下编译代码的时候是直接生成了可执行文件 xff0c
  • STM32串口printf调试输出(SSCOM V5.13.1)

    文章目录 1 原理图分析2 配置使能串口USART13 添加代码4 烧录连接显示5 浮点数输出 1 原理图分析 PC与CPU相互通信就是通过USB Type C接口和USB电平转换实现的 我们可以看到 xff0c CPU通过管脚USART1
  • CMakeLists文件的编译

    文章目录 CMakeLists的编译CMakeLists编译原理 文件路径 xff1a 编写CMakeLists txt CMakeLists常用命令 CmkeLists的基本步骤1 1 CMake版本1 2 软件包名称1 3 查找相关的C