CMakeLists 理解

2023-05-16

CMakeLists 理解

最近发现其实之前对CMakeLists 理解不是很全面, 零零散散在网上看到的一些教程,其实都是为了解决某个命令的问题,要不然就是对一些命令的翻译理解,实际上是很劝退的.

因此写一些自己对CMakeLists的具体理解,若有不当的地方欢迎指正.

1.基础理解

CmakeLists 本质上是一种生成Cmake file 文件的工具, 方便之后GNU编译使用.

那么这里理解成,CMakeLists 里面的最主要指令,可以简单理解为

链接文件 和 生成文件

由此生成一些可执行文件,这些文件是与另外一些文件链接起来的

2.add_executable()

这就是生成文件的入口,理论上,如果我们要生成一个可执行文件来自main.cpp 可以直接写成

add_executable(main.o, main.cpp)

这里默认了一件事情, 即我们main.cpp 可以单独被执行,没有其他的依赖项.若有依赖项文件,可以添加到后面, 例如

add_executable(main.o main.cpp depend.cpp)

这里就出现了一个问题, 我们在main.cpp 中调用的文件一般都是头文件, 例如 #include<depend.h>, 如果该文件与main.cpp 在同一文件夹内还好,否则是找不到该文件的, 那编译时也就找不到调用的目标了.
所以可以用另一个命令包含该文件夹 例如

include
|    depend.h
main.cpp
depend.cpp
CMakeLists.txt

可以使用

 include_directories(include)

这样就能找到我们需要的文件 depend.h了

3. link_target_libraries

一般来说我们程序里还会引入很多外部库, 其中包括很多已经编译好的库文件, 例如常用的Opencv 等等
假设我们想要调用一个Opencv 里很简单的cv imshow 函数用来显示一个图像.

编译时会发生什么呢, 首先还是一样,我们需要引入头文件的位置,这样我们程序里#include 才能找到位置.

include_directories(OpenCV_INCLUDE_DIRS)  #这里OpenCV_INCLUDE_DIRS 就是opencv 头文件所在位置

那么接下来我们是不是也应该找到imshow的实现文件,并且加入add_executable 中去呢, 可以, 但是确实没有必要. 对大部分第三方库,我们安装的时候都会生成一些 .so 文件, 如果我们使用

add_executable(main.o main.cpp depend.cpp)
target_link_libraries(main.o OpenCV_LIBRARIES)

4. find_package()

那么问题又出现了,我们知道对于一个第三方库来说,常常会有很多文件,也会有很多个lib 文件. 我们手动添加显然是不合适的, 而且是一个很大的工作量, 那么就可以使用

find_package(opencv) 

来寻找系统中已经安装好的,opencv, 一旦找到, OpenCV_INCLUDE_DIRS 和 OpenCV_LIBRARIES 就会被赋值为这写路径, 之后我们就可以直接使用了

总体来看 即为

cmake_minimum_required(VERSION 3.5) #通用 部分 设置Cmake 的最低版本

PROJECT(main)  # 设置项目名称

find_package(opencv) 

include_directories(include)

include_directories(OpenCV_INCLUDE_DIRS)  #这里OpenCV_INCLUDE_DIRS 就是opencv 头文件所在位置

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

CMakeLists 理解 的相关文章

  • 安卓studio jni调用第三方静态库CMakeLists配置

    通过CMakeLists调用第三方静态库需要加入以下CMake配置 xff1a add library mytaglib 这是我即将调用第三方静态库 xff0c 不需要写完整的静态库名 STATIC IMPORTED set target
  • CmakeLists所遇命令用法总结

    1 option命令 xff1a 形式 xff1a option lt variable gt 34 lt help text gt 34 value 简介 xff1a cmake中option起到编译开关的作用 xff0c CMakeLi
  • CMakeLists.txt文件编写

    重点 1 cmake版本要求 cmake minimum required VERSION 3 15 2 工程名 project algorithm 3 支持C 43 43 11标准 set CMAKE CXX STANDARD 11 4
  • 【ORB_SLAM2 CMakeLists.txt 文件详解】

    文章目录 ORB SLAM2 CMakeLists txt 文件详解 set CMAKE LIBRARY OUTPUT DIRECTORY PROJECT SOURCE DIR lib add library PROJECT NAME SH
  • CMakeLists笔记

    CMakeLists笔记 一 路径名二 函数三 常用 一 路径名 PROJECT SOURCE DIR xff1a 一般为catkin ws src xff0c 是cmakelists的绝对路径PROJECT BINARY DIR xff1
  • 【CMake】CMakeLists.txt的超傻瓜手把手教程(附实例源码)

    新手写CMakeLists txt简直就是实力劝退 xff0c 各种命令让很多人头大 xff0c 如何写一个最基础的CMakeLists txt呢 xff1f 本文从一个实例出发 xff0c 教你编写的基本流程 CMakeLists txt
  • CMakeLists.txt书写规则记录

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

    1 2 3 Copyright c 2017 PX4 Development Team All rights reserved 4 5 Redistribution and use in source and binary forms wi
  • 怎么写ROS中的CMakeLists.txt?

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

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

    文章目录 一 工程目录结构二 工程源代码2 1 上层目录2 1 1 cmaketest CMakeLists txt2 1 2 cmaketest main cpp2 1 3 cmaketest inc func1 hpp2 1 4 cma
  • ros下package中CMakelists的编写

    目录 一 package自动生成的Cmakelists1 指定cmake版本2 项目名字3 寻找构建所需依赖包4 启用python模块依赖5 Message Service Action 生成文件6 启动 message services
  • ros里Catkin的CMakelists/package.xml

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

    1 CMakeLists和makefile区别 xff1a CMake是一个跨平台的软件 xff0c 在很多平台可以使用 一般在windows下 xff0c 我们会直接使用VS生成项目 xff0c 在Linux下面 xff0c 我们也可以使
  • ORB_SLAM2 CMakeLIsts文件注释

    最近在学习ORB SLAM 发现基本找不到CMakeLists的代码注释 就决定自己注释一份 如果发现有问题的地方 欢迎和我交流 span class token function cmake minimum required span s
  • gcc、make、makefile、cmake、cmakelists区别

    转自 xff1a http www zhihu com question 36609459 辉常哥 1 gcc是GNU Compiler Collection xff08 就是GNU编译器套件 xff09 xff0c 也可以简单认为是编译器
  • CMakeLists.txt中FIND_PACKAGE()是如何工作的?

    官方文档 xff1a https cmake org cmake help latest command find package html FIND PACKAGE lt PackageName gt 如何查找头文件和库文件路径 xff1
  • Makefile以及CMakelists的编辑

    1 概念 在linux中不像windows和mac有图形界面 xff0c 怎么快速的用命令行运行大型项目成为一个问题 xff0c 并且像c c 43 43 需要自己添加include文件的位置 xff0c 当文件数目变多的时候 xff0c
  • CMake与CMakeLists是干什么的?

    写在最前面 xff1a 所有的博文都是为了若干年月以后当我再次翻看可以快速回想起之前的零星知识 学海无涯 xff0c 在看这篇文章的未来的你 xff0c 加油吧 xff01 因为之前看到有些软件中使用了CMake xff0c 不太理解为什么
  • CMakeList实战

    1 FIND PACKAGE FIND PACKAGE

随机推荐

  • cartographer之ceres编译

    1 首先下载ceres xff1b 2 进入ceres目录 xff1b 3 mkdir build amp amp cd build 4 cmake DEIGENSPARSE 5 make 6 sudo make install
  • 一个空文件夹和空文件占多少空间?

    用于显示文件夹和文件大小的命令 span class token function du span h 显示目前在 Linux 系统上的文件系统磁盘使用情况统计 span class token function df span i 一 问
  • 虚拟地址如何访问到物理地址

    环境 xff1a 32bit CPU 一 通过二级页表映射的方式访问物理地址 1 取一级页表的基地址Abase1 2 取虚拟地址的前12bit 31 20 地址O1 3 计算得到新地址Apgd 61 Abase1 amp 0xFFFFF00
  • 添加自定义的section

    一 基本知识点 编译出来的程序 xff08 o so exe ko等等 xff09 都是以elf格式进行排列保存的 elf文件分析情况 xff1a https blog csdn net edonlii article details 87
  • 如何打印堆栈

    一 打印堆栈可以方便问题定位 xff0c 找到具体的函数调用流程 二 打印堆栈的方法 2 1 用户态 include lt stdio h gt include lt stdlib h gt include lt stddef h gt i
  • 内存飞踩问题的几点思考

    1 程序编译 xff0c 链接后生成二进制可执行程序 二进制可执行文件以elf格式实现排列 可以通过readelf S xxxx查看具体section的划分 xff0c 粗略划分如下图所示 在这些section中 xff0c 代码段是只读的
  • CFS调度算法

    1 CFS调度算法 xff0c 顾名思义就是完全公平调度策略 比方说 xff0c 调度延迟时间是10ms xff0c 存在两个进程A和B xff0c 那么两个进程分别占用CPU的时间是5ms 然而 xff0c 阶级总是存在的 xff0c 毕
  • ARM处理器的异常模式

    1 ARM处理器有各种异常模式 xff0c 用于应对ARM出现的不同状态 出现异常时 xff0c 会随即进入相关的异常向量 xff0c 同时CPSR的寄存器也会设置成具体的模式 例 xff1a 当出现中断时 xff0c 不管是哪种中断 xf
  • 内核态和用户态相关的内存泄漏

    应用程序通过系统调用进入内核态代码 假如内核态代码存在内存泄漏 xff0c 此内存泄漏属于内核态还是用户态 xff1f 查看内核态和用户态的统计信息
  • 为什么在telnet登入界面下没有日志输出?

    1 每个进程的输入输出导向目标都可以在进程号下的fd软链接上查看 如 569号进程的输出目标是 dev console xff0c 即串口 其中0是标准输入 xff0c 1是标准输出 xff0c 2是标准错误输出 2 因此我们只需要查看te
  • 【无标题】

    1 将虚拟地址传入到内核态 xff0c 借助内核态中mm struct结构体的pgd页表基地址成员 xff0c 经过查页表的方式最终获取到物理地址 这种方法虽然很直观 xff0c 但是一会内核态 xff0c 一会用户态 xff0c 操作起来
  • C#串口=>发送和接收

    作用 xff1a 串口发送命令后 xff0c 等待下位机应答帧 代码 xff1a 一旦读取到数据就立即返回给上层 public string TXandRX byte buffer string data 发送 RS485专用 start
  • kprobe功能的代码实现

    1 可以借助 sys kernel debug tracing目录下的文件 xff0c linux提供了kprobes功能 xff0c 抓取内核函数中的入参和返回值 kprobes xff0c 强大的调试工具 sydyh43的博客 CSDN
  • 上位机使用C++通过ADS协议与倍福PLC通信例程-通过变量名方式读写浮点数

    前言 建议初学者先看这一章节内容 xff0c 里面包括一些基础的环境配置和项目建立流程 xff0c 以后开发项目这些流程是通用的 xff0c 务必掌握并熟练 链接 上位机使用C 43 43 通过ADS协议与倍福PLC通信例程 布尔变量的读取
  • 弄清USART串口的使能位(UE、TCIE、RXNEIE)和标志位(TC、RXNE)

    下面通过485半双工的通信过程 xff0c 记录USART串口的几个使能位 标志位 说明 xff1a USART IT TC 和 USART IT RXNE是一个常量 xff0c 并不代表 xff08 TC RXNE 这两位 define
  • 机器人视觉检测+跟踪:行人跟随过程中对目标提取特征+匹配

    今天上午也是没有很大的成效 xff0c 一直到下午睡醒 xff08 论好的睡眠的重要性 xff09 xff0c 在一篇帖子中看到一种新的写法 xff0c opencv3将IplImage转换为Mat格式的写法 xff0c 在我们的代码中采用
  • ubuntu firefox打不开网页

    检查ubuntu右上角联网开关是否打开 xff1a 需要勾选Enable Networking 如果能ping通其它主机地址 xff0c 浏览器却上不了网 xff0c 很有可能是dns域名解析的问题 查看域名配置文件 xff1a cat e
  • Java如何利用JNI调用C++(简略介绍及步骤)

    Java如何利用JNI调用C 43 43 xff08 简略介绍及步骤 xff09 文章目录 Java如何利用JNI调用C 43 43 xff08 简略介绍及步骤 xff09 一 原理介绍二 详细步骤步骤一 xff1a 编写Java类步骤二
  • HttpParser解析节点遇到的不解问题

    HttpParser遇到table时 xff0c 解析时 xff0c 直接抽取th或者td xff0c thead和tbody解析或出现异常 比如 lt table gt lt thead gt lt tr gt 相关内容 lt tr gt
  • CMakeLists 理解

    CMakeLists 理解 最近发现其实之前对CMakeLists 理解不是很全面 xff0c 零零散散在网上看到的一些教程 xff0c 其实都是为了解决某个命令的问题 xff0c 要不然就是对一些命令的翻译理解 xff0c 实际上是很劝退