在ubuntu18.04上编译C++版本jsoncpp/opencv/onnxruntime且如何配置CMakelist把他们用起来~

news2025/1/21 16:28:52

这篇文章背景是笔者在ubuntu上编译C++代码,依赖一些包,然后需要编译并配置到CMakelist做的笔记。主要也是一直不太懂CMakellist,做个笔记以防忘记,也给读者提供一站式的参考,可能您需要的不是这几个包,但大同小异,再带上cmakelist加持,最后提供可视化远程调试教程,可以把C++玩的飞起。这篇文章将有以下内容:

  1. 安装编译一系列工具;
  2. 编译opencv;
  3. 编译jsoncpp;
  4. 编译onnxruntime;
  5. 如何在CMakelist中配置;
  6. 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
  • 六、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还是遇到不少坑的。

  1. cc1plus: fatal error: cuda_runtime.h: No such file or directory
    这个问题就是cuda没有装好,这里建议cuda删掉重新装,安装的版本可以用笔者这边的CUDA 11.4.3和cuDNN 8.2.4,安装教程参考cuda安装教程;
  2. cmake版本过低的报错。
    按照之前的方法装较新版本的cmake就可以了,具体的版本可以查看报错信息。

五、配置CMakelist

参考:
模板:https://github.com/ganleiboy/CMakeTutorial/tree/master
讲解:https://blog.csdn.net/qq_38410730/article/details/102477162

真心感谢这两篇帖子,还是挺详细的。

写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_cuda
        opencv_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_directorieslink_directoriestarget_link_libraries,是不是还是很容易的。

  • 正儿八经配置

先进入设置
在这里插入图片描述
然后远程连接,先把服务器设置好,不会的话参照这篇,设置服务器跟pycharm远程时的服务器设置是一样的。

接着配置C++环境,他会自动检测,有什么问题按提示在服务器安装即可。
在这里插入图片描述

  • 之后在Clion上编译
    在这里插入图片描述
    编译之后会在项目目录下生成cmake-build-debug文件夹,这个文件夹就是远程调试的一个桥梁,并且这个文件夹下的目录也就是运行当前目录,生成的当前目录什么文件都会在这个目录下,要到项目目录需要..到上一级目录。
  • 再次编译,按截图下方的Rebuild Project即可。
  • 之后在右上角直接运行即可。
    在这里插入图片描述
  • 如果遇到奇奇怪怪的问题,把项目目录下的cmake-build-debug删掉,再右键项目reload cmake即可。
    在这里插入图片描述

以上就是全部内容,有什么问题可以评论,一起交流 ,Enjoy~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1007258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32f103入门(12)USART串口信息发送+接收

USART 介绍串口发送使用工具初始化发送数据接收数据 介绍 电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种: TTL电平:3.3V或5V表示1,0V表示0 RS232电平&…

成都都市圈公共图书馆《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著

成都都市圈公共图书馆《乡村振兴战略下传统村落文化旅游设计》许少辉八一新著

Discrod账号为什么被封?怎么解封?

Discord作为海外社交产品的新晋王者,近两年来非常受欢迎,据统计,每个月使用Discord的用户数超过3000万。而在跨境电商领域,”内容社群”的打法已经见怪不怪,营销推广少不了Discord,拥有一个或者多个成熟的D…

深度学习-激活函数

文章目录 基础知识Sigmoid函数 (Logistic函数)双曲正切函数(Tanh函数)线性整流函数(ReLU函数)Leaky ReLU函数Softmax函数 基础知识 激活函数是神经网络中的一种非线性函数,它作为神经元的输出函…

Linux 安装Harbor镜像仓库私服

参考链接 Docker 的基础知识、安装、使用Harbor镜像仓库私服搭建 Harbor是什么? Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。 Harbor 的所有组…

WebGL正射投影

目录 可视范围(正射类型) 可视空间 正射投影的盒状可视空间的工作原理 盒状可视空间 定义盒状可视空间 Matrix4.setOrtho() 按键控制near、far ​编辑 示例效果 示例代码 代码详解 修改near和far值 通过右方向键增大n…

从物理叠加到化学反应,看方太如何把洗碗机玩出「新价值」

文 | 智能相对论 作者 | 佘凯文 随着酷暑烈日的逐渐远去,秋意也开始浓厚了起来。所谓“秋风起,秋膘贴”,在“金九银十”的当下,美食自是不可辜负的恩赐。肥美多膏的大闸蟹、软糯香甜的南瓜羹、爽脆可口的莲藕汤..... 秋季的美食…

idea中启动maven项目报错-java: 程序包lombok.extern.slf4j不存在问题如何解决

1、 现象: 在springboot的maven项目启动时,报错: Error:(3, 27) java: 程序包lombok.extern.slf4j不存在 编译不报错,maven依赖也合适,项目就是无法启动 原因: 其实不是项目本身或者maven本身的问题&am…

Java垃圾收集机制

目录 前言 判断对象是否存活 引用计数算法 可达性分析算法 GC Root的产生 Java中的四种引用类型 1.强引用 强引用弱化方式 方式1:使对象指向null 方式2:使对象超出作用域范围 2.软引用 3.弱引用 4.虚引用 垃圾收集算法 分代收集理论 垃圾…

Linux内核及可加载内核模块编程

图1 Linux系统整体结构 图2 Linux的源代码结构 下面显示一段内核模块代码案例&#xff1a; #include <linux/moduLe.h> #include <linux/kernel.h #include <linux/intt.h> /*模块的初始化函数lkp_ init()_init是用于初始化的修饰符 */ static int __init lk…

第十五届全国大学生数学竞赛报名快要截止了,你报上名了吗?

关于组织参加 第十五届全国大学生数学竞赛的通知 01 为了培养人才、服务教学、提高大学生学习数学的兴趣&#xff0c;培养学生分析问题、解决问题的能力&#xff0c;发现和选拔数学创新人才&#xff0c;为学生提供一个展示基础知识和思维能力的舞台&#xff0c;我校决定组织参…

SSM整合demo及个人思考

SSM整合 项目整体架构说明1. 创建Maven项目2. 配置web.xml4. 配置springmvc.xml5. 配置spring.xml6. 配置mybatis-config.xml以及创建mapper接口和mapper配置文件7. 配置log4j.xml8. 后端CURD测试8.1 在数据库中插入数据8.2 pojo中的实体类Employee8.3 mapper层的EmployMapper接…

oppo手机便签隐藏了一条怎样打开?手机如何找到隐藏便签?

有不少用户在使用OPPO手机的过程中&#xff0c;遇到了一些问题&#xff0c;例如自己在使用手机系统便签应用时&#xff0c;把一条重要的便签设置了隐藏&#xff0c;但是现在找不到隐藏的便签了。 那么oppo手机便签隐藏了一条怎样打开&#xff1f;OPPO手机如何找到隐藏便签&…

【C++】基础知识点回顾 上:命名空间与输入输出

前言 学习C一段时间后&#xff0c;再回过头来看这些C的基础知识&#xff0c;感觉有很多细节是自己当时没有注意的&#xff0c;所以写一篇文章来回顾复习一下C的基础知识。 命名空间的使用 相信很多朋友在学习C的第一个代码的时候&#xff0c;在写上头文件之后&#xff0c;紧…

运营商大数据实时获取精准数据

随着大数据技术的快速发展和完善&#xff0c;出现了一种新的扩张方式——互联网大数据的精准扩张。如果没有一个好的渠道来获得顾客&#xff0c;这就像准备热情地做饭&#xff0c;但当饭吃完后&#xff0c;人们只能饿了。 今天的消费者已经从最早的线下消费逐渐过渡到互联网消…

浅谈6种API架构模式

在摸鱼刷X时&#xff0c;看到一张非常棒的图&#xff0c;是关于不同API架构的&#xff0c;下面学习记录一下。 &#xff08;摘自网络&#xff09; 1、gRPC gRPC是一种高性能、跨语言、易扩展的远程过程调用(RPC)框架&#xff0c;可用于分布式系统之间的通信。gRPC被广泛地应用…

金融贷款行业实时高精准获客 ——三网运营商大数据

都说生产是第一因素&#xff0c;但对于任何企业来说&#xff0c;客户来源才是第一因素。 在大多数行业&#xff0c;获得客户的困难已经成为行业的挑战。如今&#xff0c;许多行业和企业获得客户的主要来源是在线促销和客户获取。现在几乎每个人都有一部手机。运营商可以根据移…

每日一练 | 网络工程师软考真题Day33

阅读以下说明&#xff0c;答复以下【问题1】和【问题2】 【说明】 某单位内部网络拓扑结构如图5-1所示&#xff0c;在该网络中采用RIP路由协议。 【问题1】 1&#xff0e;路由器第一次设置时&#xff0c;必须通过Console口连接运行终端仿真软件的微机进行配置&#xff0c;此时…

ByteV联合“智农”打造--数字孪生大棚可视化

ByteV联合“智农”打造的数字孪生大棚可视化&#xff0c;不仅要让粮食稳产、增产&#xff0c;更要对土壤肥力进行改良和提升。不仅能够实现科技引领农业发展&#xff0c;更在智慧农业的基础上实现一站式托管&#xff0c;真正做到技术提升、5G引领、建后管护的闭环管理。让高标准…

预测多基因扰动的转录结果

了解细胞对基因扰动的反应是许多生物医学应用的核心&#xff0c;从识别癌症中涉及的基因相互作用到开发再生医学方法。然而&#xff0c;可能的多基因扰动数量的组合爆炸严重限制了实验验证。在这里&#xff0c;作者提出了图增强的基因激活和抑制模拟器&#xff08;GEARS&#x…