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

这篇文章背景是笔者在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_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_directorieslink_directoriestarget_link_libraries,是不是还是很容易的。

  • 正儿八经配置

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java native 关键字

如你在看 JDK 的源代码的时候,大概率会看到很多方法使用了 native 关键字。 下面是 String 对象 JDK 中的源代码,就带有了一个 native 关键字。 native 是干什么用的 简单来说就是 Java 的 native 方法的实现不是用 Java 实现的,可能在其他…

测试平台部署三——Nginx

测试平台部署——Nginx 一、nginx部署1、nginx的作用:2、案例1二、django静态文件配置和部署1、nginx工作原理2、反向代理一、nginx部署 1、nginx的作用: 静态文件服务器和反向代理django服务 进入nginx容器中 sudo docker run --rm -it nginx:alpine /bin/sh

TouchGFX之缓存位图

位图缓存是专用RAM缓冲区,应用可将位图保存(或缓存)在其中。 如果缓存了位图,在绘制位图时,TouchGFX将自动使用RAM缓存作为像素来源。位图缓存在许多情况下十分有用。 从RAM读取数据通常比从闪存读取要快(特…

应该下那个 ActiveMQ

最近在搞 ActiveMQ 的时候,发现有 2 个 ActiveMQ 可以下载。 应该下那个呢? JMS 即Java Message Service,是JavaEE的消息服务接口。 JMS主要有两个版本:1.1和2.0。 2.0和1.1相比,主要是简化了收发消息的代码。 所谓…

揭秘:Wasserstein GAN与梯度惩罚(WGAN-GP)

一、说明 什么是梯度惩罚?为什么它比渐变裁剪更好?如何实施梯度惩罚?在提起GAN对抗网络中,就不能避免Wasserstein距离的概念,本篇为系列读物,目的是揭示围绕Wasserstein-GAN建模的一些重要概念进行探讨。 图…

如何使用CMD恢复删除的分区?

分区删除后可以恢复吗? 磁盘分区旨在二级存储上创建一个或多个区域,然后你可以单独管理每个区域,这些区域就是分区。因此,对新安装的存储设备进行分区是很重要的环节,只有分区后才可以在这些设备上创建文件并保存数…

机器视觉之Basler工业相机使用和配置方法(C++)

basler工业相机做双目视觉用,出现很多问题记录一下: 首先是多看手册:https://zh.docs.baslerweb.com/software 手册内有所有的源码和参考示例,实际上在使用过程中,大部分都是这些源码,具体项目选择对应的…

《PostgreSQL物化视图:创建、维护与应用》

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🐅🐾猫头虎建议程序员必备技术栈一览表📖: 🛠️ 全栈技术 Full Stack: &#x1f4da…

Unreal Engine Loop 流程

引擎LOOP 虚幻引擎的启动是怎么一个过程。 之前在分析热更新和加载流程过程中,做了一个图。记录一下!! ![在这里插入图片描述](https://img-blog.csdnimg.cn/f11f7762f5dd42f9b4dd9b7455fa7a74.png#pic_center 只是记录,以备后用…

Android相机调用-CameraX【外接摄像头】【USB摄像头】

Android相机调用有原生的Camera和Camera2,我觉得调用代码都太复杂了,CameraX调用代码简洁很多。 说明文档:https://developer.android.com/jetpack/androidx/releases/camera?hlzh-cn 现有查到的调用资料都不够新,对于外接摄像…

机器学习实战-系列教程7:SVM分类实战2线性SVM(鸢尾花数据集/软间隔/线性SVM/非线性SVM/scikit-learn框架)项目实战、代码解读

🌈🌈🌈机器学习 实战系列 总目录 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 SVM分类实战1之简单SVM分类 SVM分类实战2线性SVM SVM分类实战3非线性SVM 3、不同软间隔C值 3.1 数据标准化的影响 如图左边是没…

Vue3样式绑定

文章目录 Vue3样式绑定1. class 属性绑定1.1 v-bind:class 设置一个对象,从而动态的切换 class1.2 在对象中传入更多属性用来动态切换多个 class1.3 直接绑定数据里的一个对象1.4 绑定一个返回对象的计算属性。这是一个常用且强大的模式1. 5 数据语法1.6 errorClass…