• 在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

    sudo apt install -y gcc
    sudo apt install -y g++
    sudo apt install -y make
    sudo apt install -y wget unzip
    
    • 1
    • 2
    • 3
    • 4

    1.2 安装cmake

    参考:

    1. (软链接) https://blog.csdn.net/KIK9973/article/details/118796510
    2. (编译) https://www.cnblogs.com/yanqingyang/p/12731855.html

    基本按照参考中的一、下载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/
    
    • 1

    这边的的链接到的路径跟原贴有区别,默认应该是/usr/bin

    1.2.3 验证

    cmake --version
    ctest --version
    
    • 1
    • 2

    看到版本信息即可:
    在这里插入图片描述

    二、编译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
    
    • 1

    再去拉取子项目

    git submodule update --init --recursive
    
    • 1

    检查是否还有子项目需要拉取

    git submodule update --init --recursive
    
    • 1
    • 编译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
    
    • 1
    • 2

    正常版:

    cd /path/to/onnxruntime
    ./build.sh --config Release --build_shared_lib --parallel --allow_running_as_root --skip_tests
    
    • 1
    • 2

    修改到没报错,然后再install一下:

    cd ./build/Linux/release
    make install
    
    • 1
    • 2

    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

    真心感谢这两篇帖子,还是挺详细的。下面是我的总结和梳理。

    5.1 动态库和静态库的区别

    这里先要了解动态库和静态库的区别,以及Windows和Linux系统的命名差异。(取自ChatGPT)

    动态库(Dynamic Link Library,DLL)和静态库(Static Library)是用于存储和重复使用代码的两种不同方法,它们有以下主要区别:

    1. 链接时机

      • 动态库:在编译时不会将库的代码复制到可执行文件中。相反,它们在运行时加载到内存中,并可以被多个应用程序共享。这使得可执行文件较小,并且库可以更新而不需要重新编译应用程序。
      • 静态库:在编译时将库的代码复制到可执行文件中。这意味着可执行文件独立于库,但也导致可执行文件较大,并且库的更新需要重新编译应用程序。
    2. 文件扩展名

      • 动态库:通常具有 .dll(在Windows系统上)或 .so(在Linux/Unix系统上)的文件扩展名。
      • 静态库:通常具有 .lib(在Windows系统上)或 .a(在Linux/Unix系统上)的文件扩展名。
    3. 内存占用

      • 动态库:多个应用程序可以共享同一个库的一个实例,因此动态库可能会在内存中存在多个副本,但通常较小。
      • 静态库:每个应用程序都包含库的一个副本,因此每个应用程序都会占用额外的内存,但库只有一个副本。
    4. 部署和维护

      • 动态库:库的更新通常只需要替换库文件,不需要重新编译应用程序。这使得更新和维护库相对容易。
      • 静态库:库的更新需要重新编译和重新部署应用程序,因为库的代码已经静态链接到应用程序中。
    5. 加载时间

      • 动态库:由于动态库在运行时加载,因此应用程序的启动速度可能较慢。
      • 静态库:由于静态库在编译时已经链接到应用程序中,因此应用程序的启动速度可能较快。

    选择使用动态库还是静态库取决于项目的需求和约束。通常,动态库更适合于库的共享和更新,而静态库更适合于独立性和性能优化。在某些情况下,也可以同时使用两者,以充分利用它们的优势。

    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_cuda
            opencv_core opencv_highgui opencv_imgproc opencv_dnn opencv_imgcodecs)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    六、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~

  • 相关阅读:
    AI图书推荐:利用生成式AI实现业务流程超自动化
    《 Python List 列表全实例详解系列(九)》__列表反转(6种方法)
    js 滚动鼠标滑轮放大缩小图片
    LeetCode 每日一题 2022/8/15-2022/8/21
    C++代码 让CPU使用率变成波形
    重新审视对比特币的九大批评!有些已被揭穿,而有些担忧可能会发生?
    深入了解代理服务器:Socks5、IP代理与网络安全
    C#异步有多少种实现方式?
    java---并查集算法_食物链(每日一道算法2022.8.17)
    Python简单实现人脸识别检测, 对照片进行评分
  • 原文地址:https://blog.csdn.net/ThomasCai001/article/details/132858098