在ubuntu18.04上编译C++版本jsoncpp/opencv/onnxruntime且如何配置CMakelist把他们用起来~
这篇文章背景是笔者在ubuntu上编译C++代码,依赖一些包,然后需要编译并配置到CMakelist做的笔记。主要也是一直不太懂CMakellist,做个笔记以防忘记,也给读者提供一站式的参考,可能您需要的不是这几个包,但大同小异,再带上cmakelist加持,最后提供可视化远程调试教程,可以把C++玩的飞起。这篇文章将有以下内容:
- 安装编译一系列工具;
- 编译opencv;
- 编译jsoncpp;
- 编译onnxruntime;
- 如何在CMakelist中配置;
- Clion远程调试服务器的C++代码;
文章目录
- 一、安装编译一系列工具
- 1.1 安装g++、gcc
- 1.2 安装cmake
- 1.2.1 官网下载cmake包
- 1.2.2 加软链接
- 1.2.3 验证
- 二、编译opencv
- 三、编译jsoncpp
- 四、编译onnxruntime
- 4.1 安装步骤
- 4.2 报错(keng)的总结
- 五、配置CMakelist
- 5.1 动态库和静态库的区别
- 5.2 CMakelist示例
- 六、Clion远程调试服务器的C++代码
一、安装编译一系列工具
1.1 安装g++、gcc
sudo apt install -y gcc
sudo apt install -y g++
sudo apt install -y make
sudo apt install -y wget unzip
1.2 安装cmake
参考:https://blog.csdn.net/KIK9973/article/details/118796510
基本按照参考中的一、下载Binary版(下载即用)
操作,不过有些细节要注意,我总结在下面,然后特别注意版本,apt install cmake
默认安装的3.10,如果对cmake版本没要求的直接命令安装就可以。这里需要安装时因为编译onnxruntime的时候会要求cmake版本,笔者这里安装的版本是3.26.4,这里我也总结下步骤。
1.2.1 官网下载cmake包
- 官网
https://cmake.org/download/ - 然后这个链接进去是新的,跳转到github下载历史版本:
https://github.com/Kitware/CMake/releases?page=2
命名规则一样,举例:
1.2.2 加软链接
ln -sf /path/to/cmake-3.XX.X-linux-x86_64/bin/* /usr/bin/
这边的的链接到的路径跟原贴有区别,默认应该是/usr/bin
1.2.3 验证
cmake --version
ctest --version
看到版本信息即可:
二、编译opencv
参考:https://zhuanlan.zhihu.com/p/473488905
参考链接中的2~4
步,当然第一步的依赖包还需要安装一下。然后基本上也没有什么问题。
三、编译jsoncpp
参考:https://blog.csdn.net/lu_linux/article/details/129851534
这个是比较简单的,按照参考中的jsoncpp编译:
即可。
四、编译onnxruntime
参考:
https://blog.csdn.net/KIK9973/article/details/118796510
https://blog.csdn.net/jizhidexiaoming/article/details/116268564
4.1 安装步骤
这个可以直接看我总结,坑还挺多的,咱们一步一步来。
- 拉取代码
先去github拉取源码:
git clone https://github.com/microsoft/onnxruntime.git
再去拉取子项目
git submodule update --init --recursive
检查是否还有子项目需要拉取
git submodule update --init --recursive
- 编译onnxruntime
cuda版本:
cd /path/to/onnxruntime
./build.sh --config Release --build_shared_lib --parallel --use_cuda --cuda_home /usr/local/cuda --cudnn_home /usr/local/cuda --allow_running_as_root --skip_tests
正常版:
cd /path/to/onnxruntime
./build.sh --config Release --build_shared_lib --parallel --allow_running_as_root --skip_tests
修改到没报错,然后再install一下:
cd ./build/Linux/release
make install
4.2 报错(keng)的总结
不得不说编译onnxruntime还是遇到不少坑的。
- cc1plus: fatal error: cuda_runtime.h: No such file or directory
这个问题就是cuda没有装好,这里建议cuda删掉重新装,安装的版本可以用笔者这边的CUDA 11.4.3和cuDNN 8.2.4,安装教程参考cuda安装教程; - cmake版本过低的报错。
按照之前的方法装较新版本的cmake就可以了,具体的版本可以查看报错信息。
五、配置CMakelist
参考:
模板:https://github.com/ganleiboy/CMakeTutorial/tree/master
讲解:https://blog.csdn.net/qq_38410730/article/details/102477162
真心感谢这两篇帖子,还是挺详细的。下面是我的总结和梳理。
5.1 动态库和静态库的区别
这里先要了解动态库和静态库的区别,以及Windows和Linux系统的命名差异。(取自ChatGPT)
动态库(Dynamic Link Library,DLL)和静态库(Static Library)是用于存储和重复使用代码的两种不同方法,它们有以下主要区别:
-
链接时机:
- 动态库:在编译时不会将库的代码复制到可执行文件中。相反,它们在运行时加载到内存中,并可以被多个应用程序共享。这使得可执行文件较小,并且库可以更新而不需要重新编译应用程序。
- 静态库:在编译时将库的代码复制到可执行文件中。这意味着可执行文件独立于库,但也导致可执行文件较大,并且库的更新需要重新编译应用程序。
-
文件扩展名:
- 动态库:通常具有
.dll
(在Windows系统上)或.so
(在Linux/Unix系统上)的文件扩展名。 - 静态库:通常具有
.lib
(在Windows系统上)或.a
(在Linux/Unix系统上)的文件扩展名。
- 动态库:通常具有
-
内存占用:
- 动态库:多个应用程序可以共享同一个库的一个实例,因此动态库可能会在内存中存在多个副本,但通常较小。
- 静态库:每个应用程序都包含库的一个副本,因此每个应用程序都会占用额外的内存,但库只有一个副本。
-
部署和维护:
- 动态库:库的更新通常只需要替换库文件,不需要重新编译应用程序。这使得更新和维护库相对容易。
- 静态库:库的更新需要重新编译和重新部署应用程序,因为库的代码已经静态链接到应用程序中。
-
加载时间:
- 动态库:由于动态库在运行时加载,因此应用程序的启动速度可能较慢。
- 静态库:由于静态库在编译时已经链接到应用程序中,因此应用程序的启动速度可能较快。
选择使用动态库还是静态库取决于项目的需求和约束。通常,动态库更适合于库的共享和更新,而静态库更适合于独立性和性能优化。在某些情况下,也可以同时使用两者,以充分利用它们的优势。
5.2 CMakelist示例
写CMakelist之前,最好把源文件放在一个地方比如src下,头文件放在一个地方比如include下,如果还有子文件夹,这个就还要自己研究下,我这边是用的简单场景,现在把我写的CMakelist放在下面作为举例,附带加上文字解释:
# 声明cmake的最低支持版本
cmake_minimum_required(VERSION 3.0)# 编译出来的文件名称,这里可以随便取,建议跟项目相关
project(YourProjectName)# 设置C++标准
set(CMAKE_CXX_STANDARD 11)# 设置模式 Debug 或者 Release
set(CMAKE_BUILD_TYPE "Debug")# 以下可以理解为变量赋值 大概为:set(变量 路径)
# 路径的依据就是如果是头文件,那么路径可以到代码中的#include"json/json.h"
# 如果是库文件,lib,那么路径直接到lib的文件夹
# ${PROJECT_SOURCE_DIR} 即为项目所在的路径
set(JSON_DIR ${PROJECT_SOURCE_DIR}/include)
set(JSON_LIB_DIR /usr/local/lib/x86_64-linux-gnu/)
set(ONNX_DIR ${PROJECT_SOURCE_DIR}/include/onnx)
set(HOME_LIB_DIR /usr/local/lib/)
set(OpenCV_INCLUDE_DIRS /usr/local/include/opencv4)# 打印变量
message("JSON_DIR 的值是: ${JSON_DIR}")
message("ONNX_DIR 的值是: ${ONNX_DIR}")
message("JSON_LIB_DIR 的值是: ${JSON_LIB_DIR}")
message("HOME_LIB_DIR 的值是: ${HOME_LIB_DIR}")
message("OpenCV_INCLUDE_DIRS 的值是: ${OpenCV_INCLUDE_DIRS}")# 批量替代
file(GLOB SOURCE_FILES "src/*.cpp")
file(GLOB SOURCE_INCLUDE_DIR "include/")# 将.cpp/.c/.cc文件生成可执行文件
add_executable(${PROJECT_NAME} ${SOURCE_FILES})# 规定.h头文件路径
include_directories(${SOURCE_INCLUDE_DIR} ${ONNX_DIR}${OpenCV_INCLUDE_DIRS} ${jsoncpp_INCLUDE_DIRS} ${JSON_DIR})# 规定.so/.a库文件路径
link_directories(${HOME_LIB_DIR} ${JSON_LIB_DIR})# 这里要把链接的库名附上 后面一系列如libonnxruntime.so只要写onnxruntime
target_link_libraries(${PROJECT_NAME} onnxruntime jsoncpp onnxruntime_providers_cudaopencv_core opencv_highgui opencv_imgproc opencv_dnn opencv_imgcodecs)
六、Clion远程调试服务器的C++代码
笔者找了好久,看网上很少有这个资料,或者不愿写又或者不多人用Clion来写C++,不过对于不太写C++的人来说,界面化调试真的很友好,然后但是Clion远程调试没接触的话,又不是那么好上手,笔者这里总结一下,一来备忘,二来能帮到朋友更好~
- 前言
Clion中调试C++重点还是CMakelist也就是上一小结,如果以前的玩家玩VS的话,这里说的Visual Stdio(不是VS对战平台哈,bushi),然后会发现有很多对应的关系,其实关键的就3个东西,一个include、一个lib、一个附加依赖项,分别对应CMakelist的include_directories
、link_directories
、target_link_libraries
,是不是还是很容易的。
- 正儿八经配置
先进入设置
然后远程连接,先把服务器设置好,不会的话参照这篇,设置服务器跟pycharm远程时的服务器设置是一样的。
接着配置C++环境,他会自动检测,有什么问题按提示在服务器安装即可。
- 之后在Clion上编译
编译之后会在项目目录下生成cmake-build-debug
文件夹,这个文件夹就是远程调试的一个桥梁,并且这个文件夹下的目录也就是运行当前目录,生成的当前目录什么文件都会在这个目录下,要到项目目录需要..
到上一级目录。 - 再次编译,按截图下方的
Rebuild Project
即可。 - 之后在右上角直接运行即可。
- 如果遇到奇奇怪怪的问题,把项目目录下的cmake-build-debug删掉,再右键项目
reload cmake
即可。
以上就是全部内容,有什么问题可以评论,一起交流 ,Enjoy~
相关文章:
在ubuntu18.04上编译C++版本jsoncpp/opencv/onnxruntime且如何配置CMakelist把他们用起来~
这篇文章背景是笔者在ubuntu上编译C代码,依赖一些包,然后需要编译并配置到CMakelist做的笔记。主要也是一直不太懂CMakellist,做个笔记以防忘记,也给读者提供一站式的参考,可能您需要的不是这几个包,但大同…...
大二上学期学习计划
这个学期主要学习的技术有SpringBoot,Vue,MybatisPlus,redis,还有要坚持刷题,算法不能落下,要坚持一天至少刷2道题目,如果没有布置任务就刷洛谷上面的,有任务的话就尽量完成任务&…...
【python爬虫—星巴克产品】
文章目录 需求爬取星巴克产品以及图片,星巴克菜单 python爬虫爬取结果 需求 爬取星巴克产品以及图片,星巴克菜单 网页分析: 首先,需要分析星巴克官方网站的结构,了解菜单栏的位置、布局以及菜单项的标签或类名等信息…...
shell SQL 变量 Oracle shell调用SQL操作DB
注意 : v\\\$ 用法, “v\\\$session ” ""不能用 sqlplus -S / as sysdba << EOF set pagesize 0 set verify off set feedback off set echo off col coun new_value v_coun select count(*) coun from dual; EOF value"$?"VALUE…...
【校招VIP】java线程池考点之核心线程数
考点介绍: 线程池是这一两年java大厂提问频度飙升的考点,需要从池子的概念理解相关参数和方法 java线程池考点之核心线程数-相关题目及解析内容可点击文章末尾链接查看! 一、考点试题 1、请列举一下启动线程有哪几种方式,之后再…...
[每周一更]-(第61期):Rust入门策略(持续更新)
一门语言的学习,就要从最基本的语法开始认识,再分析不同语言的区别,再加上实战,才能更快的学会,领悟到作者的设计思想; 介绍 Rust编程练习 开发工具VSCode及插件 社区驱动的 rust-analyzerEven Better T…...
线程安全问题的原因及解决方案
要想知道线程安全问题的原因及解决方案,首先得知道什么是线程安全,想给出一个线程安全的确切定义是复杂的,但我们可以这样认为:如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境应该的结果,…...
基于matlab中点放炮各类地震波时距曲线程序
完整程序: clear all dx50;x-500:dx:500;%炮检距 h100;V11500; theta25*pi/180; V2V1/sin(theta); t1sqrt(x.*x4*h*h)/V1;%反射波时距曲线 t2abs(x)./V1;%直达波时距曲线 %折射波时距曲线 xm2*h*tan(theta);%求盲区 k1; for i1:length(x) if x(i)<-xm …...
vue中el-dialog 中的内容没有预先加载,因此无法获得内部元素的ref 的解决方案 使用强制提前加载dialog方法
问题描述 在没有进行任何操作的时候,使用 this.$refs.xxxx 无法获取el-dialog中的内部元素,这个问题会导致很多bug,其中目前网络上也有许多关于这个问题的解决方案,但是大多数是使用el-dialog中的open在dialog打开的时候使用thi…...
vue-h5移动Web的rem配置
H5移动的适配方案 rem rem适配方案是兼容性比较好的移动端适配方案,rem支持大部分的移动端系统和机型。 rem是相对于根元素的字体大小的单位。本质上就是一个相对单位,和em的区别是:em是依赖父元素的字体来计算,rem是依赖根元素…...
企业级数据仓库-数仓实战
数仓实战 安装包大小 安装清单 环境搭建 一、环境搭建01(机器准备) 准备好三台虚拟机,并进行修改hostname、在hosts文件增加ip地址和主机名映射 。 1、设置每个虚拟机的hostname vi /etc/sysconfig/network 修改HOSTNAMEnode02修改hostna…...
Spring Boot 下载文件(word/excel等)文件名中文乱码问题|构建打包不存在模版文件(templates等)
Spring Boot 下载文件(word/excel等)文件名中文乱码问题|构建打包不存在模版文件(templates等) 准备文件,这里我放在resource下的templates路径 在pom中配置构建打包的资源,更新maven 如果使用了assembly打包插件这样配置可能仍不生效&#…...
Ansible数组同步至Shell脚本数组中
1、ansible中定义数组,我以 ccaPojectList 数组为例子,如下图数组内容 2、需要写一个j2模板的Shell脚本,在j2模板的Shell脚本中引用ansible的 ccaPojectList 数组,大致如下图: {% for item in ccaPojectList %} "{{ item }…...
私域流量的优势
私域流量是指由自身品牌或个人拥有并具备完全掌控权的流量资源。它相比于传统的广告推广,拥有独特的优势。 首先,私域流量能够更加精准地定位目标用户,实现精准传播。不再盲目投放广告,而是通过建立自身社群、粉丝群,获…...
Java 中“1000==1000”为false,而”100==100“为true?
如果你运行下面的代码: Integer a 1000, b 1000; System.out.println(a b);//1Integer c 100, d 100; System.out.println(c d);//2你会得到: false true基本知识:我们知道,如果两个引用指向同一个对象,用表示它们是相等的。如果两…...
片上网络(1)概述
前言 NoC:On-Chip Networks,片上网络。 由于多核乃至众核时代的到来,用于连接它们的可扩展、低延迟、大带宽的通信结构变得至关重要。 在核心较少时,总线Bus和矩阵/交叉开关Crossbar是主要的互联结构。总线可以提供较低的传输延迟…...
使用 React Native 针对 Android 进行开发
🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 概述 通过安装所需工具开始使用 React Native 创建新的 React Native 项目 本指南将有助于开始使用 Windows 上的…...
LeetCode 每日一题 2023/9/11-2023/9/17
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 9/11 630. 课程表 III9/12 1462. 课程表 IV9/13 2596. 检查骑士巡视方案9/14 1222. 可以攻击国王的皇后9/15 LCP 50. 宝石补给9/16 198. 打家劫舍9/17 9/11 630. 课程表 II…...
Linux系统调试篇——GDBSERVER远程调试
文章目录 安装 GDBSERVERgdbserver 用法具体步骤 本篇讲解如何使用gdbserver对目标开发板上的程序进行远程调试。 安装 GDBSERVER 首先在开发板上安装 gdbserver: apt install gdbservergdbserver 用法 gdbserver用法描述: Usage: gdbserver [OPTION…...
前端实现打字效果
前端实现打字效果 不带光标 只一次播放 HTML <!-- 需要在初始化的时候不显示文字 --> <div id"typing"></div>CSS #typing {position: relative;font-size: 24px;font-family: Arial, sans-serif;padding: 10px; }JS const text "要显…...
Unix和Linux、GNU和GPL、RHEL和Centos、Debian和Ubuntu
文章目录 Unix和LinuxGNU和GPLGNU/Linux名称的来源RHEL和CentosDebian和Ubuntu 以上都是操作系统,服务器操作系统、桌面操作系统。 对于刚刚接触Linux系统或者从事运维相关工作的人来说,肯定会听过很多名词,但是不知道他们的区别和联系&#…...
InfiniBand vs 光纤通道,存储协议的选择
数字时代,数据量爆发增长,企业越来越迫切地追求高吞吐量、低延迟和更高性能的网络基础设施,存储协议的选择变得愈发至关重要。在众多存储协议中,InfiniBand和光纤通道备受关注。本文旨在深入探讨InfiniBand和光纤通道作为存储协议…...
第2章_freeRTOS入门与工程实践之单片机程序设计模式
本教程基于韦东山百问网出的 DShanMCU-F103开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id724601559592 配套资料获取:https://rtos.100ask.net/zh/freeRTOS/DShanMCU-F103 freeRTOS系列教程之freeRTOS入…...
python LeetCode 刷题记录 58
题目 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 输入:s "Hello World" 输出:5 解释&am…...
HarmonyOS开发:那些开发中常见的问题汇总(一)
前言 本来这篇文章需要讲述静态共享包如何实现远程依赖和上传以及关于静态共享包私服的搭建,非常遗憾的告诉大家,由于组织管理申请迟迟未通过,和部分文档官方权限暂未开放,关于这方面的讲解需要延后了,大概需要等到202…...
新能源汽车驱动电机的基本知识
学习目标:了解电机的基本知识。能力目标:培养学生搜集和整理相关资料的能力。素质目标:培养学生良好的职业素养。额定电店.在夫见定条件下电池工作的*于佳 电压知识准备术语和定义。 (1)驱动电机系统 通过有效的控制策略将动力蓄电池提供的直流电转化为交流实现电机的正转以及反…...
流媒体协议——RTSP
RTSP RTSP(Real Time Streaming Protocol):实时流媒体协议,是基于文本的协议,采用ISO10646字符集,使用UTF-8编码 RTSP-over-TCP,默认端口554 RTSP-over-HTTP,默认端口为8080 RTSP OVER WebSocket 默认端口为 80&am…...
Arcgis提取点数据经纬度
Arcgis提取点数据经纬度 现已打开tiff影像和采样点的shape文件。目标是提取采样点的经纬度信息然后导出。 打开数据管理工具-要素-添加XY坐标 在点的图层上右击打开属性表时,经纬度信息已经添加到属性表中。 在属性表的左上角中点击导出,导出为文本文…...
【小记录】jupyter notebook新版本
手欠升级 😅今天手贱,在anaconda navigator里面更新了最新版本的spyder,然后莫名奇妙地jupyter notebook就打不开了😅,报错说缺少模块”ModuleNotFoundError: No module named jupyter_server.contents“,…...
Ubuntu安装深度学习环境相关(yolov8-python部署)
Ubuntu安装深度学习环境相关(yolov8-python部署) 本文将从如下几个方面总结相关的工作过程: Ubuntu系统安装(联想小新pro16) 2.显卡驱动安装3.测试深度学习模型 1. Ubunut 系统安装 之前在台式机上安装过Ubuntu,以为再在笔记本上安装会是小菜一碟&…...
微信运营推广方案/北京做的好的seo公司
目录 一、概述 二、内部类的分类 1、成员内部类 2、局部内部类 三、匿名内部类 1、匿名内部类含义 2、匿名内部类的作用与格式 一、概述 将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称之为内部类&#x…...
资阳网站建设/百度热词指数
VR行业近年来的发展可谓是如火如荼,而与之相关的360度VR全景视频拍摄也跟着大火,无论是刚刚入行的初学者还是资深全景摄影师来说,掌握一些360度VR全景视频拍摄技巧能让你拍出更高质量的作品,这是非常有必要的,今天为大…...
独山县哪里有做网站的/百度收录api怎么提交
思路:题意抽象出来就是,找到一个最小边权值为d,删除大于d的边,使得剩下的联通块的个数不大于k个。这个题我们可以发现d越大连通块越少,d与连通块个数成单调函数。 那么可以二分d,然后dfs/bfs求联通块个数判…...
电商网站制作方案/网络推广文案策划
Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: In aggregated query without GROUP BY, expression #3 of SELECT list contains nonaggregated column...
大连的网站制作公司/百度一下就知道百度首页
Apache的mod_rewrite是提供了强大URL操作的杀手级的模块,可以实现几乎所有你梦想的URL操作类型,其代价是你必须接受其复杂性,因为mod_rewrite的主要障碍就是初学者不容易理解和运用,即使是Apache专家有时也会发掘出mod_rewrite的新…...
wordpress发信设置/许昌网站推广公司
1.安装依赖 pip install --upgradetools pip install numpy Matplotlib 2.安装opencv-python(网络一定要通畅) pip install opencv-python...