Linux下CMake学习笔记和在QT的应用

2023-05-16

一、cmake的介绍

CMak可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接拿到其它平台上使用,只需要少量的修改,非常方便。camke的主要特点:

  1. 跨平台(可以从很多开源的代码都提供cmakelist文件即可看出)
  2. 能够管理大型项目
  3. 简化编译构建过程,写好了cmakelist.txt文件后,在终端只需要输入cmake+make即可

二、安装cmake

安装cmake的命令:

sudo apt install cmake

查看cmake版本号的命令:

cmake -version

三、简单样例

学习编程的最简单的案例—打印Hello World
3.1 创建main.c的命令

touch main.c

3.2 在main.c文件中,粘贴以下代码

#include <stdio.h>
int main(void)
{
	printf("Hello World\n");

	return 0;
}

3.3 创建CMakeLists.txt(文件名是CMakeLists.txt才行,这样才能让cmake识别出来)

touch CMakeLists.txt

在CMakeLists.txt中,粘贴以下代码

# 表示cmake的最低版本要求是2.8
cmake_minimum_required (VERSION 2.8)
# 表示本工程信息,也就是工程名叫demo
project (demo)
# 表示最终要生成的elf文件的名字叫main,使用的源文件是main.c
add_executable(main main.c)

3.4 在main.c和CMakeLists.txt所在的目录下,创建build文件,并将终端切到build文件中

# 创建名字为build的文件夹
mkdir build
# 将终端切到build的文件夹里面
cd build

3.5 输入以下命令运行cmake和make

# 编译CMakeLists.txt来生成makefile文件,由于CMakeLists.txt在上一级目录,所有用“..”
cmake ..
# 编译程序
make

3.6 编译成功后,会生成的一堆文件,运行可执行文件来打印Hello World

./main

四、cmake指令介绍

4.1 基本的指令,cmake的最低版本号、工程名称、是否包含当前目录、c++的版本

#cmake的最低版本号
cmake_minimum_required(VERSION 2.6)
#工程名称
project(demo)
#设置工程包含当前目录
set(CMAKE_INCLUDE_CURRENT_DIR ON)

添加编译选项,如-Wall,-std=c++11等

add_compile_options(-std=c++11 -Wall) 

4.2 添加目录
向工程添加多个指定头文件的搜索路径,因为c文件和cpp文件一般包含很多头文件(这些头文件的写法一般为相对路径),因此需要添加对应的头文件搜索路径

include_directories (include)  # 添加当前目录下的include文件夹路径

查找在某个路径下的所有源文件

aux_source_directory (src SRC_LIST)  # 其与FILE(GLOB SRC_FILES "./src/*.c")功能类似

4.3 加载源文件
在实际工程中,为了规划程序,一般将cpp文件放到src文件夹

FILE(GLOB_RECURSE SRC_FILES "./src/*.cpp")

注释:GLOB_RECURSE与GLOB的区别—GLOB只会将某个目录中的源文件加载,而不会加载其子目录的源文件;而GLOB_RECURSE会将某个目录和其子目录的源文件都加载

4.4 动态库和静态库的编译控制和加载

add_library (testFunc_shared SHARED ${SRC_LIST})
add_library (testFunc_static STATIC ${SRC_LIST})

set_target_properties (testFunc_shared PROPERTIES OUTPUT_NAME "testFunc")
set_target_properties (testFunc_static PROPERTIES OUTPUT_NAME "testFunc")
set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

add_library:生成动态库或静态库(第1个参数指定库的名字;第2个参数决定是动态还是静态,如果没有就默认静态;第3个参数指定生成库的源文件)
set_target_properties: 设置最终生成的库的名称,还有其它功能,如设置库的版本号等等
LIBRARY_OUTPUT_PATH: 库文件的默认输出路径,这里设置为工程目录下的lib目录

动态库和静态库的加载

find_library(TESTFUNC_LIB testFunc HINTS ${PROJECT_SOURCE_DIR}/lib)
target_link_libraries (main ${TESTFUNC_LIB})

find_library: 在指定目录下查找指定库,并把库的绝对路径存放到变量里,其第一个参数是变量名称,第二个参数是库名称,第三个参数是HINTS,第4个参数是路径,其它用法可以参考cmake文档
target_link_libraries: 把目标文件与库文件进行链接

find_library(TESTFUNC_LIB testFunc HINTS ${PROJECT_SOURCE_DIR}/testFunc/lib)

target_link_libraries (main ${TESTFUNC_LIB})

4.5 加载cuda、opencv、protobuf、tensorrt的设置
查找cuda

find_package(CUDA REQUIRED)
include_directories(${CUDA_INCLUDE_DIRS}) 
link_directories(/usr/local/cuda-11.4/lib64) 

查找opencv

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS}/opencv ${OpenCV_INCLUDE_DIRS}/opencv2)
#link_directories(${OpenCV_LIBS})

查找protobuf

find_package(Protobuf REQUIRED)
include_directories(${Protobuf_INCLUDE_DIRS})  
#link_directories(${Protobuf_LIBRARIES})

#查找tensorrt

include_directories(/home/***/TensorRT-8.2.1.8/include)
link_directories(/home/***/TensorRT-8.2.1.8/lib)

4.6 qt应用的设置
打开全局moc,设置自动生成moc文件,AUTOMOC打开可以省去QT5_WRAP_CPP命令.如果源代码中使用qt的QObject派生的C++类,一定要设置

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

查找需要的Qt库文件,最好每一个库都要写,Qt也会根据依赖关系自动添加

find_package(Qt5Widgets) 
find_package(Qt5Core)
# 或者
find_package(Qt5 COMPONENTS  Widgets Core)   

4.7 编译可执行文件

add_executable(${PROJECT_NAME} ${CPP_LIST})   # 编译可执行文件
TARGET_LINK_LIBRARIES(hello PRIVATE Qt5::Widgets ${OpenCV_LIBS} ${CUDA_LIBRARIES}  ${Protobuf_LIBRARIES} -lopenvino_intel_gpu_plugin -lopenvino_onnx_frontend -lopenvino -ltbb)   # 导入库

4.8 对于需要加载cu文件

#查找当前文件夹内的所有cu文件
FILE(GLOB_RECURSE CU_LIST ${PROJECT_SOURCE_DIR}/*.cu)
#当需要编译cu文件时,需要加入下面来两行代码
set(CUDA_GEN_CODE "-gencode=arch=compute_75,code=sm_75")# compute_75:需要根据自己设备的算力来设置                  
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS}  -std=c++11 -O0 -Xcompiler -fPIC -g -w ${CUDA_GEN_CODE}")

注释:由于cu文件是涉及到cuda核函数,所以在生成可执行文件的代码由add_executable变成CUDA_add_executable

在QT上如何利用CMakeList.txt来打开项目

第一步:打开qtcreator软件
第二步:在软件的左上角点击“文件”的选项
第三步:选择打开文件或者项目,选定好CMakeList.txt,即可

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

Linux下CMake学习笔记和在QT的应用 的相关文章

  • Linux 卸载及删除磁盘分区

    1 卸载分区 root 64 centos7 df Th Filesystem Type Size Used Avail Use Mounted on dev mapper centos root xfs 17G 4 0G 14G 24 d
  • 磁盘阵列raid5的创建及管理

    1 在虚拟机上添加4个磁盘 xff0c 其中主用盘3个 xff0c 热备盘1个 root 64 centos7 fdisk l Disk dev sda 21 5 GB 21474836480 bytes 41943040 sectors
  • Keil关于.axf文件报错

    项目场景 xff1a 熟悉Keil C51的同学在使用Keil MDK编译STM32系列单片机时会更容易上手 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统 xff0c 与汇编相比 xff0c
  • 《java核心技术卷1》部分章节读书笔记

    目录 3 java基本的程序设计结构3 1 命名规范3 2 数据类型3 3 运算符3 4 枚举类型 3 5 字符串3 6 大数值 BigInteger和BigDecimal3 7 数组 4 对象与类4 1 识别类4 2 类之间的关系4 3
  • linux 问题-——退出vi编辑器 wq失效

    退出linux的vi编辑器时 xff0c 先按左上角的esc按键 xff0c 再输出输入命令 保存不退出w强制保存但不退出w 保存并退出wq强制保存并退出wq xff01 不保存退出q不保存并强制退出q 出现以下问题 xff1a esc退出
  • SUMO中车辆类型的定义及路由文件的写法

    车辆类型的定义 在SUMO中 xff0c 通过vType标签来定义车辆的类型 xff0c 一般可以写成如下形式 xff1a span class token operator lt span vType id span class toke
  • 为什么c语言允许直接访问物理地址?

    C语言允许直接访问物理地址 xff0c 是因为它是一种面向底层的语言 xff0c 提供了底层的硬件操作和系统调用的能力 在C语言中 xff0c 可以通过指针变量直接访问内存地址 xff0c 从而对硬件进行底层控制和操作 在一些应用场景下 x
  • TortoiseGit 安装和使用

    TortoiseGit是一款适用于Windows系统的开源的git版本控制客户端 xff0c 其优点是使用图像化界面操作 xff0c 而不需要记住或使用Git命令 xff0c 从而增加开发效率 xff0c 对不熟悉命令的使用者比较友善 下面
  • 解放拖动屏幕的双手——用xrandr配置多屏显示

    操作系统 xff1a Arch Linux 桌面系统 xff1a Xfce 又是一次会议的结束 xff0c 待我回办公室把大屏幕接上 xff0c 准备继续干 等等 xff0c 这是怎么回事 xff1f 打开系统的Display设置一看 xf
  • 深入浅出BGP

    文章目录 深入浅出BGP说明一 BGP的产生1 1 动态路由的分类1 2 BGP概述 二 与IGP的区别三 BGP核心3 1 属性3 1 1 属性特点 3 2 选路规则3 3 对等体 深入浅出BGP 说明 此篇主要对BGP的产生 与IGP的
  • LVM跨主机迁移

    LVM跨主机迁移 虚拟机 实验环境 两台Centos 7 8虚拟机 xff0c IP xff1a 192 168 221 199 200 查看lv test中的数据 使用命令lsblk xff0c 确认逻辑卷vg下挂有两个分区均为sdb磁盘
  • CodeBlocks 20.03安装&汉语化&找不到编译器

    一 CodeBlocks下载 下载地址 xff1a https www codeblocks org downloads binaries 到如下界面选择下载codeblocks 20 03mingw setup exe xff0c 这个里
  • 【FreeRTOS】从0写简易RTOS实现任务切换

    1 RTOS引入 单片机性能越来越强 xff0c 很多Linux程序在单片机上也可以运行了 xff1a 这需要RTOS 我们要开发的单片机产品 xff0c 功能也越来越丰富 xff1a 这也需要RTOS 就个人技术发展来说 xff0c 单片
  • java中的抽象类与接口(面试常考,重要)!!

    目录 抽象类语法规则注意事项 重要 xff0c 全部掌握 抽象类的作用 接口语法规则注意事项提示类实现多个接口 接口使用实例 Comparable 接口与Comparator接口 xff09 Comparable接口Comparator接口
  • Tensorflow2.0学习(十) — 基础张量、微分操作及自定义层

    因为再后面一些分享的章节的内容很多是基于经典论文的复现了 xff0c 里面会牵扯到很多自定义的模型及其变换 而这些内容有些是我们的Keras API 无法完成的 例如Resnet的residual block 因此这一节课我们有必要去学习一
  • 数据加解密时Base64异常:Illegal base64 character 3a

    现象 用base64工具类对中文进行处理时出现异常 xff0c 在数据加解密场景中经常使用 java lang IllegalArgumentException Illegal base64 character 3a at java uti
  • HTML5学习资料

    xff08 一 xff09 HTML5的原型设计模板平台 http www zzfriend com xiazai moban http www ke01 com html5cmsmuban http www ui92 com down 2
  • centOS7安装图形化界面

    三步 1 yum groupinstall y 34 Server with GUI 34 这一步是下载图形化界面 2 reboot 重启一下 3 init 5 这一步是进入图形化界面模式 xff0c 如果配置文件里已经默认的是init 5
  • PHPExcel下载excel文件正常,打开报错:'break' not in the 'loop' or 'switch' context

    其实 xff0c thinkphp的报错已经很明显了 39 break 39 not in the 39 loop 39 or 39 switch 39 context错误位置FILE private var www backend Thi
  • ubuntu 系统出现 仓库 “http://ppa.launchpad.net/fcitx-team/nightly/ubuntu xenial Release“ 没有Release文件

    Ubuntu系统在执行sudo apt get update 后出现仓库 http ppa launchpad net fcitx team nightly ubuntu xenial Release 没有Release文件的错误 解决办法

随机推荐

  • Docker bridge网络模式搭建

    提示 xff1a 在 docker 中新建网络后 xff0c 容器绑定在新建网络上的容器可以用容器名ping其他的容器 xff0c 但是在默认网络上的容器是无法直接使用容器名ping通的 bridge网络搭建 1 安装brctl yum i
  • 【Python】python读取excel超链接

    前言 表格存在两种格式 xls 和 xlsx xff0c 所以python存在两种库分别读取这两种格式表格超链接 openpyl针对 xlsx格式 xff0c xlrd针对 xls文件 示例如下 xff1a 1 openpyl coding
  • 基于51单片机的12864液晶演示器驱动

    span class token macro property span class token directive keyword include span span class token string lt reg52 h gt sp
  • Ubuntu安装VNC4Server遇到的问题与解决方法

    在Ubuntu安装VNC4Server时 xff0c 报错 xff1a Package 39 vnc4server 39 has no installation candidate 这是由于没有找到apt get的source 可以按照以下
  • sumo中随机产生车流

    在sumo中绘制地图 xff0c 然后利用sumo中的randomTrips py工具产生随机的车流量 一 首先绘制路网 xff0c 本文绘制了一个九宫格路网 xff08 myroad net xml xff09 xff0c 如下图 xff
  • 计算机网络第一章概述总结知识点

    第1章 概述 本章最重要的内容 xff1a 互联网边缘部分和核心部分的作用 xff0c 什么是分组交换 xff1f 计算机网络的性能指标有哪些计算机网络分层次的体系结构是怎样的 xff1f 什么是协议和服务 xff1f 本章的重要概念 互联
  • pip安装git

    解决 xff1a Cannot find command git do you have git installed and in your PATH 和系统找不到指定的文件 while executing command git http
  • 卷积神经网络的特征图可视化秘籍——PyTorch实现

    卷积神经网络的特征图可视化秘籍 PyTorch实现 可视化的定义及步骤PyTorch实现以预训练好的VGG16为例进行可视化关键代码剖析如果是自行搭建的网络 xff0c 如何索引网络层 xff1f 继续使用序号索引不使用序号 xff0c 直
  • pip出现的问题

    正常使用示例 xff1a 安装numpy pip install numpy 临时加镜像源 pip install numpy i https pypi tuna tsinghua edu cn simple 镜像源 xff1a 清华 xf
  • 词权重 (term weight)方案总结

    目录 1 无监督 unsupervised 方法1 1 统计方法 xff08 TF TF IDF YAKE 1 2 图方法 TextRank SingleRank TopicRank PositionRank 2 有监督 supervise
  • Windows上安装Curl工具

    一 介绍 curl是利用URL语法在命令行方式下工作的开源文件传输工具 它被广泛应用在Unix 多种Linux发行版中 xff0c 并且有DOS和Win32 Win64下的移植版本 二 安装步骤 2 1 下载资源包 官网 xff1a htt
  • ESP8266 Arduino开发环境从零开始配置

    目录 1 安装Arduino IDE2 添加 ESP8266 支持3 添加依赖库4 完毕 1 安装Arduino IDE Arduino IDE 是由 Arduino 官方提供的支持 C 语言的集成开发环境 xff0c 主要是针对 Ardu
  • 使用HDFS的Java接口对文件基本操作

    使用HDFS的Java接口进行文件的读写 FileSystem对象 要从Hadoop文件系统中读取文件 xff0c 最简单的办法是使用java net URL对象打开数据流 xff0c 从中获取数据 不过这种方法一般要使用FsUrlStre
  • elastic学习笔记(一)

    elasticsearch安装 xff08 V7 10 0 xff09 踩坑笔记 一 elasticsearch在6 X版本后不允许使用root账户启动 创建其他账户 adduser es 创建密码 passwd es 二 生产环境安装完毕
  • 主机可以ping通虚拟机但无法访问虚拟机某一端口

    问题描述 主机可以ping通虚拟机 xff0c 但是服务器启动状态下访问 192 168 200 152 8888失败 背景 UFW防火墙已经开放 8888 端口 原因和解法 firewall这个防火墙的8888端口没有开放 xff0c 使
  • WSL安装ubuntu18.04+2016VCS+Verdi——记录安装过程错误

    前言 xff1a 安装过程花了一个星期 xff0c 最开始是wsl的图形化界面一直没搞出来 xff0c 等图形化界面安装好之后 xff0c 安装vcs和verdi的过程又是一波三折 xff08 这段可不看 xff0c 总结一下自己踩过的坑
  • 【stm32】ST-LINK Connection error解决方法之一

    ST LINK报错原因之一 xff1a 固件丢失 好久没有用开发板和stlink xff0c 今天发现下载报错 xff0c 明明电脑已经装了stlink驱动 猜测可能是stlink固件丢失 span class token number 1
  • 云服务器VNC安装教程

    文章目录 1 VNC Viewer 注册及安装2 云服务器安装配置2 1 ssh安装和配置2 2 Tightvncserver 安装2 2 安装 gnome 桌面2 3 远程连接端口开启2 4 Xstartup文件编辑2 5 云服务器端口配
  • 浅谈STP协议

    1 STP协议解决什么问题 xff1f 解决网络拓扑中冗余链路产生的环路问题 2 STP协议有什么优缺点 xff1f 解决树形接口的可靠性问题 xff0c 有主备线路 xff0c 当主链路出现故障后 xff0c 可以感知网络的变化 xff0
  • Linux下CMake学习笔记和在QT的应用

    一 cmake的介绍 CMak可以让我们通过编写简单的配置文件去生成本地的Makefile xff0c 这个配置文件是独立于运行平台和编译器的 xff0c 这样就不用亲自去编写Makefile了 xff0c 而且配置文件可以直接拿到其它平台