完整指南:CNStream流处理多路并发框架适配到NVIDIA Jetson Orin (三) 代码编译、各种问题解决、代码修改

目录

[1 infer_server编译](#1 infer_server编译)

[1.1 infer_server/CMakeLists.txt修改](#1.1 infer_server/CMakeLists.txt修改)

[1.2 FindLibCompute.cmake编写](#1.2 FindLibCompute.cmake编写)

[1.2 findLibCVCuda.cmake编写](#1.2 findLibCVCuda.cmake编写)

[1.3 ./3rdparty/config_lib_aarch64.sh修改](#1.3 ./3rdparty/config_lib_aarch64.sh修改)

[1.4 解决各种编译错误](#1.4 解决各种编译错误)

[1.4.1 /usr/include/c++/11/bits/algorithmfwd.h:259:5: error: 'pair' does not name a type](#1.4.1 /usr/include/c++/11/bits/algorithmfwd.h:259:5: error: ‘pair’ does not name a type)

[1.4.2 no matching function for call to 'std::unique_ptr::unique_ptr(trt::trtnet_t*&, infer_server::M](#1.4.2 no matching function for call to ‘std::unique_ptr::unique_ptr(trt::trtnet_t*&, infer_server::M)

[1.4.3 /usr/include/c++/11/iosfwd:193:11: error: 'basic_ostringstream' does not name a type; did you mean 'basic_ostream'?](#1.4.3 /usr/include/c++/11/iosfwd:193:11: error: ‘basic_ostringstream’ does not name a type; did you mean ‘basic_ostream’?)

[1.4.4 error: no declaration matches 'bool infer_server::DecodeFFmpeg::Create(VdecCreateParams*)'](#1.4.4 error: no declaration matches ‘bool infer_server::DecodeFFmpeg::Create(VdecCreateParams*)’)

[1.4.5 error: 'TRANSFORM_COMPUTE_CVCUDA' was not declared in this scope; did you mean 'TRANSFORM_COMPUTE_NVCUDA'?](#1.4.5 error: ‘TRANSFORM_COMPUTE_CVCUDA’ was not declared in this scope; did you mean ‘TRANSFORM_COMPUTE_NVCUDA’?)

[1.4.6 error: 'shared_ptr' in namespace 'std' does not name a template type](#1.4.6 error: ‘shared_ptr’ in namespace ‘std’ does not name a template type)

[1.4.7 error: 'cuCreateStream' was not declared in this scope](#1.4.7 error: ‘cuCreateStream’ was not declared in this scope)

[1.4.8 error: 'BUF_MEMORY_DVPP' was not declared in this scope; did you mean 'BUF_MEMORY_HOST'?](#1.4.8 error: ‘BUF_MEMORY_DVPP’ was not declared in this scope; did you mean ‘BUF_MEMORY_HOST’?)

[2 整体工程cmake](#2 整体工程cmake)

[2.1By not providing "FindLibAclLite.cmake" in CMAKE_MODULE_PATH this projec](#2.1By not providing "FindLibAclLite.cmake" in CMAKE_MODULE_PATH this projec)

[3 编译framework](#3 编译framework)

[4 编译modules](#4 编译modules)

[4.1 atal error: cuda_runtime.h: No such file or directory](#4.1 atal error: cuda_runtime.h: No such file or directory)

[5 编译app](#5 编译app)

[5.1 error: 'BUF_MEMORY_NORMAL' was not declared in this scope; did you mean 'BUF_MEMORY_HOST'?](#5.1 error: ‘BUF_MEMORY_NORMAL’ was not declared in this scope; did you mean ‘BUF_MEMORY_HOST’?)

[5.2 warning: libavformat.so.59, needed by /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so, not found (try using -rpath or -rpath-link)](#5.2 warning: libavformat.so.59, needed by /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so, not found (try using -rpath or -rpath-link))

[5.3 undefined reference to `av_dict_free(AVDictionary**)'](#5.3 undefined reference to `av_dict_free(AVDictionary**)')

[5.4 /data/chw/nvstream/3rdparty/freetype/lib/linux_lib/libfreetype.so.6: undefined reference to `fstat@GLIBC_2.33'](#5.4 /data/chw/nvstream/3rdparty/freetype/lib/linux_lib/libfreetype.so.6: undefined reference to `fstat@GLIBC_2.33')

参考文献:


记录下将CNStream流处理多路并发Pipeline框架适配到NVIDIA Jetson AGX Orin的过程,以及过程中遇到的问题,我的jetson盒子是用jetpack5.1.3重新刷机之后的,这是系列博客的第三篇。

这篇博客记录下编译步骤、编译过程中遇到的各种问题、问题解决步骤。中间特别简单的错误就不记录了,只记录稍微有点代表性的错误。

1 infer_server编译

先编译inferserver模块,一个模块一个模块的编译。

1.1 infer_server/CMakeLists.txt修改

bash 复制代码
cmake_minimum_required(VERSION 3.5)

# ---[ nvis project
project(nvis C CXX)

#######################################################################
# -- Build Flags

option(NVIS_RECORD_PERF "Enable record performance" OFF)

#######################################################################
set(NVIS_VERSION_MAJOR 1)
set(NVIS_VERSION_MINOR 0)
set(NVIS_VERSION_PATCH 0)
set(NVIS_VERSION "${NVIS_VERSION_MAJOR}.${NVIS_VERSION_MINOR}.${NVIS_VERSION_PATCH}")

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
               ${CMAKE_CURRENT_SOURCE_DIR}/include/nvis/config.h)

set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNDEBUG -O3")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG -g")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 ")

# set runtime path
set(CNSTREAM_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/..)
set(CMAKE_MODULE_PATH "${CNSTREAM_ROOT_PATH}/cmake")

# ---[ Compute
find_package(LibCompute)
if(NOT LibCompute_FOUND)
   message(FATAL_ERROR "LibCompute not found!")
endif()

# ---[ CVC-CUDA
find_package(LibCVCuda)
if(NOT LibCVCuda_FOUND)
   message(FATAL_ERROR "LibCVCuda not found!")
endif()

# ---[ Google-glog
find_package(Glog)
if(NOT Glog_FOUND)
   message(FATAL_ERROR "Glog not found!")
endif()

# ---[ Google-gflags
find_package(GFlags)
if(NOT GFlags_FOUND)
   message(FATAL_ERROR "GFlags not found!")
endif()

file(GLOB_RECURSE contrib_srcs ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
file(GLOB_RECURSE infer_server_srcs ${CMAKE_CURRENT_SOURCE_DIR}/src/core/*.cpp
                                    ${CMAKE_CURRENT_SOURCE_DIR}/src/model/*.cpp
                                    ${CMAKE_CURRENT_SOURCE_DIR}/src/processor/*.cpp
                                    ${CMAKE_CURRENT_SOURCE_DIR}/src/nv/*.cpp
                                    ${CMAKE_CURRENT_SOURCE_DIR}/src/util/*.cpp)

set(LIBRARY_OUTPUT_PATH ${CNSTREAM_ROOT_PATH}/lib)
message(STATUS "@@@@@@@@@@@ Target : nvis")
add_library(nvis SHARED ${infer_server_srcs} ${contrib_srcs})

if (NVIS_RECORD_PERF)
  target_compile_definitions(D PRIVATE NVIS_RECORD_PERF)
endif()

target_include_directories(nvis PRIVATE
                           ${LibCompute_INCLUDE_DIRS}
                           ${LibCVCuda_INCLUDE_DIRS}
                           ${CMAKE_CURRENT_SOURCE_DIR}/include
                           ${CMAKE_CURRENT_SOURCE_DIR}/src
                           ${GLOG_INCLUDE_DIRS}
                           ${GFLAGS_INCLUDE_DIRS}
                           )
       
target_link_libraries(nvis PRIVATE ${LibCompute_LIBRARIES} ${LibCVCuda_LIBRARIES} ${GLOG_LIBRARIES})

set_target_properties(nvis PROPERTIES VERSION ${NVIS_VERSION})
set_target_properties(nvis PROPERTIES SOVERSION ${NVIS_VERSION_MAJOR})

然后还需要编写两个findxxx.cmake文件

1.2 FindLibCompute.cmake编写

bash 复制代码
# - Try to find Compute headers and libraries.
#
# Usage of this module as follows:
#
#     find_package(LibCompute)
#
# Variables used by this module, they can change the default behaviour and need
# to be set before calling find_package:
#
#  LibCompute_ROOT_DIR  Set this variable to the root installation of
#                    LibCompute if the module has problems finding
#                    the proper installation path.
#
# Variables defined by this module:
#
#  LibCompute_FOUND              System has LibCompute libs/headers
#  LibCompute_LIBRARIES          The LibCompute libraries
#  LibCompute_INCLUDE_DIRS        The location of LibCompute headers

find_path(LibCompute_ROOT_DIR
    NAMES include/export_funtions.h
    PATHS ${CNSTREAM_ROOT_PATH}/3rdparty/jetson/compute
)

find_path(LibCompute_INCLUDE_DIRS
    NAMES export_funtions.h
    PATHS ${LibCompute_ROOT_DIR}/include
)

find_path(LibCompute_CUDA_INCLUDE_DIRS
    NAMES cuda_runtime.h
    PATHS ${LibCompute_ROOT_DIR}/include/cuda
)

set(LibCompute_LIBRARIES "")
set(COMPUTE_LIBS cudart trteng_exp cuda_utils)
foreach(lib ${COMPUTE_LIBS})
  find_library(LibCompute_LIBRARIES_${lib}
    NAMES ${lib}
    PATHS ${LibCompute_ROOT_DIR}/lib/linux_lib
    NO_DEFAULT_PATH
  )
  
  if(LibCompute_LIBRARIES_${lib})
    list(APPEND LibCompute_LIBRARIES ${LibCompute_LIBRARIES_${lib}})
  endif()
endforeach()

if (LibCompute_INCLUDE_DIRS)
	list(APPEND LibCompute_INCLUDE_DIRS ${LibCompute_CUDA_INCLUDE_DIRS})
endif ()

if (LibCompute_LIBRARIES)
    set(LibCompute_FOUND TRUE)
endif ()

1.2 findLibCVCuda.cmake编写

bash 复制代码
# - Try to find CVCuda headers and libraries.
#
# Usage of this module as follows:
#
#     find_package(LibCVCuda)
#
# Variables used by this module, they can change the default behaviour and need
# to be set before calling find_package:
#
#  LibCVCuda_ROOT_DIR  Set this variable to the root installation of
#                    LibCVCuda if the module has problems finding
#                    the proper installation path.
#
# Variables defined by this module:
#
#  LibCVCuda_FOUND              System has LibCVCuda libs/headers
#  LibCVCuda_LIBRARIES          The LibCVCuda libraries
#  LibCVCuda_INCLUDE_DIRS        The location of LibCVCuda headers

find_path(LibCVCuda_ROOT_DIR
    NAMES include/cvcuda/Version.h
    PATHS ${CNSTREAM_ROOT_PATH}/3rdparty/jetson/cvcuda
)

find_path(LibCVCuda_INCLUDE_DIRS
    NAMES cvcuda/Version.h
    PATHS ${LibCVCuda_ROOT_DIR}/include
)

find_library(LibCVCuda_LIBRARIES
	NAMES cvcuda
	PATHS ${LibCVCuda_ROOT_DIR}/lib/linux_lib
)

find_library(LibNVCV_Types_LIBRARIES
	NAMES nvcv_types
	PATHS ${LibCVCuda_ROOT_DIR}/lib/linux_lib
)

if (LibCVCuda_LIBRARIES)
	list(APPEND LibCVCuda_LIBRARIES ${LibNVCV_Types_LIBRARIES})
    set(LibCVCuda_FOUND TRUE)
endif ()

然后直接

bash 复制代码
cd /data/chw/nvstream/infer_server/build
cmake -DCMAKE_BUILD_TYPE=Debug ..
make -j4

然后满屏幕的报错。。。。。。。。。。。。。,

1.3 ./3rdparty/config_lib_aarch64.sh修改

在里面增加cuda相关的库的软链接配置。

bash 复制代码
#!/bin/bash

#创建软连接脚本
#------------------
root=$(pwd)
arch=aarch64

#----------------------------------
# jetson: compute cuda
#----------------------------------
cd ${root}/jetson/compute/lib/linux_lib
\cp ../${arch}/* .

#1> Cuda
ln -snf libcublas.so.11.6.6.84 libcublas.so.11
ln -snf libcublas.so.11 libcublas.so

ln -snf libcublasLt.so.11.6.6.84 libcublasLt.so.11
ln -snf libcublasLt.so.11 libcublasLt.so

ln -snf libcudart.so.11.4.298 libcudart.so.11.0
ln -snf libcudart.so.11.0 libcudart.so.11
ln -snf libcudart.so.11 libcudart.so

ln -snf libcurand.so.10.2.5.297 libcurand.so.10
ln -snf libcurand.so.10 libcurand.so

ln -snf libnvrtc.so.11.4.300 libnvrtc.so.11
ln -snf libnvrtc.so.11 libnvrtc.so

ln -snf libnvrtc-builtins.so.11.4.300 libnvrtc-builtins.so.11.4
ln -snf libnvrtc-builtins.so.11.4 libnvrtc-builtins.so.11
ln -snf libnvrtc-builtins.so.11 libnvrtc-builtins.so

ln -snf libcudnn_ops_infer.so.8.6.0 libcudnn_ops_infer.so.8
ln -snf libcudnn_ops_infer.so.8 libcudnn_ops_infer.so

ln -snf libcudnn_cnn_infer.so.8.6.0 libcudnn_cnn_infer.so.8
ln -snf libcudnn_cnn_infer.so.8 libcudnn_cnn_infer.so

ln -snf libcudnn.so.8.6.0 libcudnn.so.8
ln -snf libcudnn.so.8 libcudnn.so

#2> TensorRT
ln -snf libnvinfer.so.8.5.2 libnvinfer.so.8
ln -snf libnvinfer.so.8 libnvinfer.so

ln -snf libnvinfer_plugin.so.8.5.2 libnvinfer_plugin.so.8
ln -snf libnvinfer_plugin.so.8 libnvinfer_plugin.so


#----------------------------------
# jetson: cv-cuda
#----------------------------------
cd ${root}/jetson/cvcuda/lib/linux_lib
\cp ../${arch}/* .

ln -snf libcvcuda.so.0.10.1 libcvcuda.so.0
ln -snf libcvcuda.so.0 libavcodec.so

ln -snf libnvcv_types.so.0.10.1 libnvcv_types.so.0
ln -snf libnvcv_types.so.0 libavdevice.so


#----------------------------------
# ActiveMQ
#----------------------------------
cd ${root}/activemq/lib/linux_lib
\cp ../${arch}/* .

cd ${root}/activemq/include
ln -snf apr-1_aarch64 apr-1

#----------------------------------
# ffmpeg
#----------------------------------
cd ${root}/ffmpeg/lib/linux_lib
\cp ../${arch}/* .

ln -snf libavcodec.so.58.134.100 libavcodec.so.58
ln -snf libavcodec.so.58 libavcodec.so

ln -snf libavdevice.so.58.13.100 libavdevice.so.58
ln -snf libavdevice.so.58 libavdevice.so

ln -snf libavfilter.so.7.110.100 libavfilter.so.7
ln -snf libavfilter.so.7 libavfilter.so

ln -snf libavformat.so.58.76.100 libavformat.so.58
ln -snf libavformat.so.58 libavformat.so

ln -snf libavutil.so.56.70.100 libavutil.so.56
ln -snf libavutil.so.56 libavutil.so

ln -snf libswresample.so.3.9.100 libswresample.so.3
ln -snf libswresample.so.3 libswresample.so

ln -snf libswscale.so.5.9.100 libswscale.so.5
ln -snf libswscale.so.5 libswscale.so

ln -snf libnvmpi.so.1.0.0 libnvmpi.so.1
ln -snf libnvmpi.so.1 libnvmpi.so

ln -snf libx264.so.164 libx264.so
ln -snf libx265.so.204 libx265.so

#----------------------------------
# opencv
#----------------------------------
cd ${root}/opencv/lib/linux_lib
\cp ../${arch}/* .

ln -snf libopencv_core.so.4.6.0 libopencv_core.so.406
ln -snf libopencv_core.so.406 libopencv_core.so

ln -snf libopencv_highgui.so.4.6.0 libopencv_highgui.so.406
ln -snf libopencv_highgui.so.406 libopencv_highgui.so

ln -snf libopencv_imgproc.so.4.6.0 libopencv_imgproc.so.406
ln -snf libopencv_imgproc.so.406 libopencv_imgproc.so

ln -snf libopencv_imgcodecs.so.4.6.0 libopencv_imgcodecs.so.406
ln -snf libopencv_imgcodecs.so.406 libopencv_imgcodecs.so

ln -snf libopencv_video.so.4.6.0 libopencv_video.so.406
ln -snf libopencv_video.so.406 libopencv_video.so

ln -snf libopencv_videoio.so.4.6.0 libopencv_videoio.so.406
ln -snf libopencv_videoio.so.406 libopencv_videoio.so

ln -snf libopencv_features2d.so.4.6.0 libopencv_features2d.so.406
ln -snf libopencv_features2d.so.406 libopencv_features2d.so

ln -snf libopencv_flann.so.4.6.0 libopencv_flann.so.406
ln -snf libopencv_flann.so.406 libopencv_flann.so

ln -snf libopencv_calib3d.so.4.6.0 libopencv_calib3d.so.406
ln -snf libopencv_calib3d.so.406 libopencv_calib3d.so

ln -snf libopencv_dnn.so.4.6.0 libopencv_dnn.so.406
ln -snf libopencv_dnn.so.406 libopencv_dnn.so

#----------------------------------
# librdkafka
#----------------------------------
cd ${root}/librdkafka/lib/linux_lib
\cp ../${arch}/* .

#----------------------------------
# mqtt
#----------------------------------
cd ${root}/mqtt/lib/linux_lib
\cp ../aarch64/* .
ln -snf libpaho-mqttpp3.so.1.2.0 libpaho-mqttpp3.so.1
ln -snf libpaho-mqttpp3.so.1 libpaho-mqttpp3.so

ln -snf libpaho-mqtt3a.so.1.3.8 libpaho-mqtt3a.so.1
ln -snf libpaho-mqtt3a.so.1 libpaho-mqtt3a.so

ln -snf libpaho-mqtt3as.so.1.3.8 libpaho-mqtt3as.so.1
ln -snf libpaho-mqtt3as.so.1 libpaho-mqtt3as.so

#----------------------------------
# gflags
#----------------------------------
cd ${root}/gflags/lib/linux_lib
\cp ../${arch}/* .
ln -snf libgflags.so.2.2 libgflags.so.2
ln -snf libgflags.so.2 libgflags.so

#----------------------------------
# glog
#----------------------------------
cd ${root}/glog/lib/linux_lib
\cp ../${arch}/* .
ln -snf libglog.so.0 libglog.so

#----------------------------------
# uuid
#----------------------------------
cd ${root}/uuid/lib/linux_lib
\cp ../${arch}/* .
ln -snf libuuid.so.1.3.0 libuuid.so.1
ln -snf libuuid.so.1 libuuid.so

#----------------------------------
# openssl
#----------------------------------
cd ${root}/openssl/lib/linux_lib
\cp ../${arch}/* .
ln -snf libssl.so.1.1 libssl.so
ln -snf libcrypto.so.1.1 libcrypto.so

#----------------------------------
# freetype
#----------------------------------
cd ${root}/freetype/lib/linux_lib
\cp ../${arch}/* .
ln -snf libfreetype.so.6.18.1 libfreetype.so.6
ln -snf libfreetype.so.6 libfreetype.so

#----------------------------------
# tcp_pubsub
#----------------------------------
cd ${root}/tcp_pubsub/lib/linux_lib
\cp ../${arch}/* .
ln -snf libtcp_pubsub.so.1.0.0 libtcp_pubsub.so.1
ln -snf libtcp_pubsub.so.1 libtcp_pubsub.so

1.4 解决各种编译错误

1.4.1 /usr/include/c++/11/bits/algorithmfwd.h:259:5: error: 'pair' does not name a type

cpp 复制代码
In file included from /usr/include/c++/11/bits/stl_algo.h:60,
                 from /usr/include/c++/11/algorithm:62,
                 from /data/chw/nvstream/infer_server/src/core/data_type.cpp:23:
/usr/include/c++/11/bits/algorithmfwd.h:259:5: error: 'pair' does not name a type
  259 |     pair<_FIter, _FIter>
      |     ^~~~
/usr/include/c++/11/bits/algorithmfwd.h:264:5: error: 'pair' does not name a type
  264 |     pair<_FIter, _FIter>
      |     ^~~~
/usr/include/c++/11/bits/algorithmfwd.h:432:5: error: 'pair' does not name a type
  432 |     pair<const _Tp&, const _Tp&>
      |     ^~~~
/usr/include/c++/11/bits/algorithmfwd.h:437:5: error: 'pair' does not name a type
  437 |     pair<const _Tp&, const _Tp&>
      |     ^~~~
/usr/include/c++/11/bits/algorithmfwd.h:442:5: error: 'pair' does not name a type
  442 |     pair<_FIter, _FIter>
      |     ^~~~
/usr/include/c++/11/bits/algorithmfwd.h:447:5: error: 'pair' does not name a type
  447 |     pair<_FIter, _FIter>
      |     ^~~~
/usr/include/c++/11/bits/algorithmfwd.h:453:9: error: 'template<class _Tp> _Tp infer_server::std::min' conflicts with a previous declaration
  453 |     min(initializer_list<_Tp>);
      |         ^~~~~~~~~~~~~~~~
/usr/include/c++/11/bits/algorithmfwd.h:425:5: note: previous declaration 'namespace infer_server::std { }::min'
  425 |     min(const _Tp&, const _Tp&, _Compare);
      |     ^~~
/usr/include/c++/11/bits/algorithmfwd.h:453:9: error: 'initializer_list' was not declared in this scope; did you mean 'std::initializer_list'?

这种在标准C++库的头文件中报错的不正常,网上搜都让我加上#include <utility>,但我觉得不应该是修改标准库文件,然后我仔细看了下报错,发现有个

那我觉得应该是这个文件里面哪里写错了,

修改方法

1.4.2 no matching function for call to 'std::unique_ptr<trt::trtnet_t>::unique_ptr(trt::trtnet_t*&, infer_server::M

bash 复制代码
/data/chw/nvstream/infer_server/src/model/model.h:114:88: error: no matching function for call to 'std::unique_ptr<trt::trtnet_t>::unique_ptr(trt::trtnet_t*&, infer_server::Model::GetRunner(int)::<lambda(trt::trtnet_t*)>)'
  114 |             TEngine engine = TEngine(net, [](trt::trtnet_t* n) { trt::release_net(n); });

修改代码

cpp 复制代码
//using TEngine = std::unique_ptr<trt::trtnet_t>;
using TEngine = std::unique_ptr<trt::trtnet_t, std::function<void(trt::trtnet_t*)>>;

1.4.3 /usr/include/c++/11/iosfwd:193:11: error: 'basic_ostringstream' does not name a type; did you mean 'basic_ostream'?

反正也是满屏幕的报错,

这个原因是因为我现在只是编译的inferser模块,但是里面的DEFER操作确实去找了外面的cnstream命令空间的东西,所以这里在infer_server的命名空间中也再定义一个DEFER

修改infer_server/include/common/utils.hpp

cpp 复制代码
/*************************************************************************
 * Copyright (C) [2022] by Cambricon, Inc. All rights reserved
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *************************************************************************/

#ifndef COMMON_UTILS_HPP_
#define COMMON_UTILS_HPP_

#include <string>
#include <map>
#include <functional>
#include <glog/logging.h>

#include "buf_surface.h"

#include "cuda_runtime.h"

#include <nvcv/ImageFormat.h>

namespace infer_server {
    // defer(xxx) like golang's defer
#define DEFER _DEFER_ACTION_MAKE /* ([&](){ ... }); */

#define _DEFER_ACTION_MAKE auto \
        _DEFER_ACTION_VAR(_defer_action_line, __LINE__, _) = _DeferredActionCtor
#define _DEFER_ACTION_VAR(a, b, c) _DEFER_TOKEN_CONNECT(a, b, c)
#define _DEFER_TOKEN_CONNECT(a, b, c) a ## b ## c

    class _DeferredAction {
    private:
        _DeferredAction(_DeferredAction const&) = delete;
        _DeferredAction& operator=(_DeferredAction const&) = delete;

        std::function<void()> func_;

        template<typename T>
        friend _DeferredAction _DeferredActionCtor(T&& p);

        template<typename T>
        _DeferredAction(T&& p) : func_(std::forward<T>(p)) {}

    public:
        _DeferredAction(_DeferredAction&& other) :
            func_(other.func_) {
            other.func_ = nullptr;
        }
        ~_DeferredAction() {
            if (func_) { func_(); }
        }
    };

    template<typename T>
    _DeferredAction _DeferredActionCtor(T&& p) {
        return _DeferredAction(p);
    }
}

/**
* @brief calculate aligned number
* @param [in]: num: the original number that to aligned
* @param [in]: align: the align factor
* @return the number after aligned
*/
#define ALIGN_UP(num, align) (((num) + (align) - 1) & ~((align) - 1))

#define _SAFECALL(func, expected, msg, ret_val)                                                     \
  do {                                                                                              \
    int _ret = (func);                                                                              \
    if ((expected) != _ret) {                                                                       \
      LOG(ERROR) << "[InferServer] Call [" << #func << "] failed, ret = " << _ret << ". " << msg;        \
      return (ret_val);                                                                             \
                }                                                                                               \
        } while (0)

#define CUDA_SAFECALL(func, msg, ret_val) _SAFECALL(func, cudaSuccess, msg, ret_val)

#define _CALLFUNC(func, expected, msg)                                                     \
  do {                                                                                              \
    int _ret = (func);                                                                              \
    if ((expected) != _ret) {                                                                       \
      LOG(ERROR) << "[InferServer] Call [" << #func << "] failed, ret = " << _ret << ". " << msg;        \
                        }                                                                                               \
            } while (0)

#define CALL_CUDA_FUNC(func, msg) _CALLFUNC(func, cudaSuccess, msg)

inline BufSurfaceMemType CastMemoryType(cudaMemoryType type) noexcept{
    switch (type) {
    case cudaMemoryTypeUnregistered:
        return BUF_MEMORY_UNREGISTERED;
    case cudaMemoryTypeHost:
        return BUF_MEMORY_HOST;
    case cudaMemoryTypeDevice:
        return BUF_MEMORY_DEVICE;
    case cudaMemoryTypeManaged:
        return BUF_MEMORY_MANAGED;
    default:
        LOG(ERROR) << "[InferServer] CastMemoryType(): Unsupported memory type";
        return BUF_MEMORY_HOST;
    }
}

inline cudaMemoryType CastMemoryType(BufSurfaceMemType type) noexcept{
    switch (type) {
    case BUF_MEMORY_UNREGISTERED:
        return cudaMemoryTypeUnregistered;
    case BUF_MEMORY_HOST:
        return cudaMemoryTypeHost;
    case BUF_MEMORY_DEVICE:
        return cudaMemoryTypeDevice;
    case BUF_MEMORY_MANAGED:
        return cudaMemoryTypeManaged;
    default:
        LOG(ERROR) << "[InferServer] CastMemoryType(): Unsupported memory type";
        return cudaMemoryTypeHost;
    }
}

inline BufSurfaceColorFormat CastColorFmt(NVCVImageFormat format) {
    static std::map<NVCVImageFormat, BufSurfaceColorFormat> color_map{
        { NVCV_IMAGE_FORMAT_NV12, BUF_COLOR_FORMAT_NV12 },
        { NVCV_IMAGE_FORMAT_NV21, BUF_COLOR_FORMAT_NV21 },
        { NVCV_IMAGE_FORMAT_RGB8, BUF_COLOR_FORMAT_RGB },
        { NVCV_IMAGE_FORMAT_BGR8, BUF_COLOR_FORMAT_BGR },
    };
    return color_map[format];
}

inline NVCVImageFormat CastColorFmt(BufSurfaceColorFormat format) {
    static std::map<BufSurfaceColorFormat, NVCVImageFormat> color_map{
        { BUF_COLOR_FORMAT_NV12, NVCV_IMAGE_FORMAT_NV12 },
        { BUF_COLOR_FORMAT_NV21, NVCV_IMAGE_FORMAT_NV21 },
        { BUF_COLOR_FORMAT_RGB, NVCV_IMAGE_FORMAT_RGB8 },
        { BUF_COLOR_FORMAT_BGR, NVCV_IMAGE_FORMAT_BGR8 },
    };
    return color_map[format];
}

#endif  // COMMON_UTILS_HPP_

1.4.4 error: no declaration matches 'bool infer_server::DecodeFFmpeg::Create(VdecCreateParams*)'

这是因为声明和定义的地方,返回值不一致。修改源文件中函数定义,

cpp 复制代码
#include <iostream>
#include "glog/logging.h"
#include "decode_impl_nv.hpp"
#include "transform.h"
#include "common/utils.hpp"

namespace infer_server {

    int DecodeFFmpeg::Create(VdecCreateParams *params) {
        create_params_ = *params;
        
        switch (params->type) {
        case VDEC_TYPE_H264:
            av_codec_ = avcodec_find_decoder(AV_CODEC_ID_H264);
            break;
        case VDEC_TYPE_H265:
            av_codec_ = avcodec_find_decoder(AV_CODEC_ID_H265);
            break;
        case VDEC_TYPE_JPEG:
        default:
            LOG(ERROR) << "[InferServer] [DecodeFFmpeg] Create(): Unsupported codec type: " << create_params_.type;
            return -1;
        }

        if (!av_codec_) {
            LOG(ERROR) << "[InferServer] [DecodeFFmpeg] avcodec_find_decoder failed";
            return -1;
        }

        codec_context_ = avcodec_alloc_context3(av_codec_);
        if (!codec_context_) {
            LOG(ERROR) << "[InferServer] [DecodeFFmpeg] Failed to do avcodec_alloc_context3";
            return -1;
        }
        
        codec_context_->pix_fmt = AV_PIX_FMT_CUDA;

        AVDictionary *decoder_opts = nullptr;
        DEFER([&decoder_opts] {
            if (decoder_opts) av_dict_free(&decoder_opts);
        });

        av_dict_set_int(&decoder_opts, "device_id", 0, 0);

        if (avcodec_open2(codec_context_, av_codec_,  &decoder_opts) < 0) {
            LOG(ERROR) << "[InferServer] [DecodeFFmpeg] Failed to open codec";
            return -1;
        }
        av_frame_ = av_frame_alloc();
        if (!av_frame_) {
            LOG(ERROR) << "[InferServer] [DecodeFFmpeg] Could not alloc frame";
            return -1;
        } 

        ResetFlags();

        if (transformer_ == nullptr) {
            TransformConfigParams config;
            config.compute_mode = TRANSFORM_COMPUTE_CVCUDA;
            config.device_id = create_params_.device_id;

            if (TransformCreate(&transformer_, &config) != 0) return -1;
        }

        created_ = true;

        return 0;
    }


    int DecodeFFmpeg::SendStream(const VdecStream *stream, int timeout_ms) {

        if (!created_) {
            LOG(ERROR) << "[InferServer] [DecodeFFmpeg] SendStream(): Decoder is not created";
            return -1;
        }

        if (nullptr == stream || nullptr == stream->bits) {
            if (eos_sent_) {
                LOG(WARNING) << "[InferServer] [DecodeFFmpeg] SendStream(): EOS packet has been send";
                return 0;
            }
             
            AVPacket framePacket = {};
            av_init_packet(&framePacket);
        
            framePacket.data = nullptr;
            framePacket.size = 0;
            
            avcodec_send_packet(codec_context_, &framePacket);
            // flush all frames ...
            int ret = 0;
            do {
                ret = avcodec_receive_frame(codec_context_, av_frame_);
                if(ret >= 0)
                {
                    OnFrame(av_frame_, stream->pts);
                }

            } while (ret >= 0);
            eos_sent_ = true;
            OnEos();
        }
        else{
            if (eos_sent_) {
                LOG(ERROR) << "[InferServer] [DecodeFFmpeg] SendStream(): EOS has been sent, process packet failed, pts:"
                    << stream->pts;
                return -1;
            }
            AVPacket framePacket = {};
            av_init_packet(&framePacket);
        
            framePacket.data = stream->bits;
            framePacket.size = stream->len;

            //开始解码
            int ret = avcodec_send_packet(codec_context_, &framePacket);
            if (ret < 0) {
                LOG(ERROR) << "[InferServer] [DecodeFFmpeg] avcodec_send_packet failed, data ptr, size:"
                        << framePacket.data << ", " << framePacket.size;
                return ret;
            }

            while (ret >= 0) {
                av_frame_unref(av_frame_);
                ret = avcodec_receive_frame(codec_context_, av_frame_);

                if (ret == AVERROR_EOF || ret == AVERROR(EAGAIN))
                    return ret;
                else if (ret < 0) {
                    continue;
                }

                OnFrame(av_frame_, stream->pts);
            }
        }
        return 0;
    }


    void DecodeFFmpeg::OnFrame(AVFrame *av_frame_, uint32_t frame_id) {

        BufSurface *surf = nullptr;
        if (create_params_.GetBufSurf(&surf, av_frame_->width, av_frame_->height, CastColorFmt(NVCV_IMAGE_FORMAT_BGR8),//这里得按照bgr去getbufsurf.
            create_params_.surf_timeout_ms, create_params_.userdata) < 0) {
            LOG(ERROR) << "[InferServer] [DecoderAcl] OnFrame(): Get BufSurface failed";
            OnError(-1);
            return;
        }
        if (surf->mem_type != BUF_MEMORY_MANAGED) {
            LOG(ERROR) << "[InferServer] [DecoderAcl] OnFrame(): BufSurface memory type must be BUF_MEMORY_MANAGED";
            return;
        }

        //switch (av_frame_->format) {
        //case AV_PIX_FMT_YUV420P:
        //case AV_PIX_FMT_YVU420P:

        //    //由于cvcuda不支持yuv的resize,所以先统一转成BGR,然后如果宽高不相等就resize,如果宽高相等就直接拷贝。
        //    BufSurface transform_src;
        //    BufSurfaceParams src_param;
        //    memset(&transform_src, 0, sizeof(BufSurface));
        //    memset(&src_param, 0, sizeof(BufSurfaceParams));

        //    src_param.color_format = CastColorFmt(av_frame_->format);
        //    //src_param.data_size = static_cast<uint32_t>(av_frame_->linesize);
        //    src_param.data_ptr = reinterpret_cast<void *>(av_frame_->data);

        //    VLOG(5) << "[InferServer] [DecoderAcl] OnFrame(): codec_frame: "
        //        << " width = " << av_frame_->width
        //        << ", height = " << av_frame_->height
        //        << ", width stride = " << av_frame_->linesize
        //        << ", height stride = " << av_frame_->height;
        //    VLOG(5) << "[InferServer] [DecoderAcl] OnFrame(): surf->surface_list[0]: "
        //        << " width = " << surf->surface_list[0].width
        //        << ", height = " << surf->surface_list[0].height
        //        << ", width stride = " << surf->surface_list[0].width_stride
        //        << ", height stride = " << surf->surface_list[0].height_stride;

        //    src_param.width = av_frame_->width;
        //    src_param.height = av_frame_->height;
        //    //src_param.width_stride = static_cast<uint32_t>(av_frame_->linesize);
        //    src_param.height_stride = av_frame_->height;//待修改。

        //    transform_src.batch_size = 1;
        //    transform_src.num_filled = 1;
        //    transform_src.device_id = create_params_.device_id;
        //    transform_src.mem_type = BUF_MEMORY_MANAGED;
        //    transform_src.surface_list = &src_param;


        //    BufSurface transform_temp;
        //    BufSurfaceParams temp_param;
        //    memset(&transform_temp, 0, sizeof(BufSurface));
        //    memset(&temp_param, 0, sizeof(BufSurfaceParams));

        //    temp_param.color_format = CastColorFmt(NVCV_IMAGE_FORMAT_BGR8);
        //    temp_param.data_size = av_frame_->linesize[0]*av_frame_->height*3;
        //   // std::unique_ptr<char[]> temp_param_data(new char[temp_param.data_size]);
        //   // temp_param.data_ptr = temp_param_data.get();

        //    VLOG(5) << "[InferServer] [DecoderAcl] OnFrame(): codec_frame: "
        //        << " width = " << av_frame_->width
        //        << ", height = " << av_frame_->height
        //        << ", width stride = " << av_frame_->linesize
        //        << ", height stride = " << av_frame_->height;
        //    VLOG(5) << "[InferServer] [DecoderAcl] OnFrame(): surf->surface_list[0]: "
        //        << " width = " << surf->surface_list[0].width
        //        << ", height = " << surf->surface_list[0].height
        //        << ", width stride = " << surf->surface_list[0].width_stride
        //        << ", height stride = " << surf->surface_list[0].height_stride;

        //    temp_param.width = av_frame_->width;
        //    temp_param.height = av_frame_->height;
        //    temp_param.width_stride = av_frame_->linesize[0];
        //    temp_param.height_stride = av_frame_->height;//待修改。

        //    transform_temp.batch_size = 1;
        //    transform_temp.num_filled = 1;
        //    transform_temp.device_id = create_params_.device_id;
        //    transform_temp.mem_type = BUF_MEMORY_MANAGED;
        //    transform_temp.surface_list = &temp_param;

        //    TransformParams trans_params;
        //    memset(&trans_params, 0, sizeof(trans_params));
        //    trans_params.transform_flag = TRANSFORM_CONVERT_FORMAT;//TRANSFORM_RESIZE_SRC;

        //    //YUV-BGR
        //    if (Transform(transformer_, &transform_src, &transform_temp, &trans_params) < 0) {
        //        LOG(ERROR) << "[InferServer] [height] OnFrame(): Transfrom failed";
        //        break;
        //    }

        //    //resize
        //    if (surf->surface_list[0].width != av_frame_->width || surf->surface_list[0].height != av_frame_->height) {
        //        surf->surface_list[0].data_size = surf->surface_list[0].width * surf->surface_list[0].height * 3;
        //        if (Transform(transformer_, &transform_temp, surf, &trans_params) < 0) {
        //            LOG(ERROR) << "[InferServer] [height] OnFrame(): Transfrom failed";
        //            break;
        //        }
        //    }
        //    else {
        //        //std::chrono::high_resolution_clock::time_point tnow = std::chrono::high_resolution_clock::now();
        //      //  CALL_ACL_FUNC(MemcpyHD(surf->surface_list[0].data_ptr, codec_image->size, codec_image->data.get(), codec_image->size, codec_image->deviceId)
        //     //      , "[height] OnFrame(): copy codec buffer data to surf failed");
        //                     
        //       // std::chrono::high_resolution_clock::time_point tpost = std::chrono::high_resolution_clock::now();
        //        //std::cout << "<<<<<<================================ CopyDataToHostEx time = " << std::chrono::duration_cast<std::chrono::duration<double>>(tpost - tnow).count() * 1000 << " ms" << std::endl;
   
        //    }
        //    break;
        //default:
        //    break;
        //}

        surf->pts = frame_id;
        
        //std::chrono::high_resolution_clock::time_point tnow = std::chrono::high_resolution_clock::now();
        create_params_.OnFrame(surf, create_params_.userdata);
        //std::chrono::high_resolution_clock::time_point tpost = std::chrono::high_resolution_clock::now();
        //std::cout << "<<<<<<================================ create_params_.OnFrame time = " << std::chrono::duration_cast<std::chrono::duration<double>>(tpost - tnow).count() * 1000 << " ms" << std::endl;
    }

    int DecodeFFmpeg::Destroy() {

        if (!created_) {
            LOG(WARNING) << "[InferServer] [DecoderAcl] Destroy(): Decoder is not created";
            return 0;
        }
        
        // if error happened, destroy directly, eos maybe not be transmitted from the decoder
        if (!eos_sent_) {
            SendStream(nullptr, 10000);
        }

        ResetFlags();

        if (av_frame_) {
            av_frame_free(&av_frame_);
            av_frame_ = nullptr;
        }
        if (codec_context_) {
            avcodec_close(codec_context_);
            avcodec_free_context(&codec_context_);
            codec_context_ = nullptr;
        }

        if (transformer_ != nullptr) {
            TransformDestroy(transformer_);
        }
        return 0;
    }

    void DecodeFFmpeg::ResetFlags() {
        eos_sent_ = false;
        created_ = false;
    }

    void DecodeFFmpeg::OnEos() {
        create_params_.OnEos(create_params_.userdata);
    }
   
    void DecodeFFmpeg::OnError(int errcode) {
        //convert the error code
        create_params_.OnError(static_cast<int>(errcode), create_params_.userdata);
    }

}  // namespace 

1.4.5 error: 'TRANSFORM_COMPUTE_CVCUDA' was not declared in this scope; did you mean 'TRANSFORM_COMPUTE_NVCUDA'?

写错了,修改一下定义

cpp 复制代码
typedef enum {
  /** Specifies VPP as a compute device for Ascendxxxx. */
  TRANSFORM_COMPUTE_DEFAULT,
  /** Specifies that the acl is the compute device. */
  TRANSFORM_COMPUTE_CVCUDA,
  /** Specifies the number of compute modes. */
  TRANSFORM_COMPUTE_NUM
} TransformComputeMode;

1.4.6 error: 'shared_ptr' in namespace 'std' does not name a template type

这是因为定义错了,新版本的叫Tensor,没有I

修改整个infer_server/src/nv/transform_impl_nv.hpp

cpp 复制代码
#ifndef TRANSFORM_IMPL_NV_HPP_
#define TRANSFORM_IMPL_NV_HPP_

#include <algorithm>
#include <cstring> 
#include <atomic>
#include <memory>

#include "../transform_impl.hpp"
#include "transform.h"
#include "common/utils.hpp"

#include <nvcv/Tensor.hpp>

#include <cvcuda/OpCvtColor.hpp>
#include <cvcuda/OpResize.hpp>
#include <cvcuda/OpCustomCrop.hpp>
#include <cvcuda/OpCopyMakeBorder.hpp>

namespace infer_server {

    class TransformerNV : public ITransformer {
    public:
        TransformerNV() {

        }
        ~TransformerNV() = default;

        int Create(TransformConfigParams *params) override;
        int Destroy() override;
        int Transform(BufSurface *src, BufSurface *dst, TransformParams *transform_params) override;

    private:
        int DoNVTransform(BufSurface *src, BufSurface *dst, TransformParams *transform_params);
        int NVResize(BufSurface *src, BufSurface *dst, TransformParams *transform_params);
        int NVCrop(BufSurface *src, BufSurface *dst, TransformParams *transform_params);
        int NVCropResize(BufSurface *src, BufSurface *dst, TransformParams *transform_params);
        int NVCropResizePaste(BufSurface *src, BufSurface *dst, TransformParams *transform_params);
        int NVConvertFormat(BufSurface *src, BufSurface *dst, TransformParams *transform_params);

    private:
        TransformConfigParams create_params_;
        void* cu_stream_{nullptr};
        std::shared_ptr<nvcv::Tensor> crop_tensor_;
        std::shared_ptr<nvcv::Tensor> resized_tensor_;
        std::shared_ptr<nvcv::Tensor> cvtcolor_tensor_;
        std::shared_ptr<nvcv::Tensor> copymakeborder_tensor_;

        std::shared_ptr<cvcuda::CustomCrop> crop_op_;    
        std::shared_ptr<cvcuda::Resize> resize_op_;
        std::shared_ptr<cvcuda::CvtColor> cvtcolor_op_;
        std::shared_ptr<cvcuda::CopyMakeBorder> copymakeborder_op_;
        

        std::atomic<bool> created_{};
    };

}  // namespace 

#endif  // TRANSFORM_IMPL_MLU370_HPP_

1.4.7 error: 'cuCreateStream' was not declared in this scope

增加头文件 #include "cuda_utils_sdk.h"

1.4.8 error: 'BUF_MEMORY_DVPP' was not declared in this scope; did you mean 'BUF_MEMORY_HOST'?

if (src->mem_type != BUF_MEMORY_MANAGED)

修改为

if (src->mem_type != BUF_MEMORY_MANAGED) {

2 整体工程cmake

2.1By not providing "FindLibAclLite.cmake" in CMAKE_MODULE_PATH this projec

bash 复制代码
CMake Warning at framework/CMakeLists.txt:22 (find_package):
  By not providing "FindLibAclLite.cmake" in CMAKE_MODULE_PATH this project
  has asked CMake to find a package configuration file provided by
  "LibAclLite", but CMake did not find one.

直接删掉

不写笔记了,中间又修改了很多个CMakeLists.txt

3 编译framework

framework是框架的东西,这个几乎没修改代码,编译没报错。

bash 复制代码
root@ubuntu:/data/chw/nvstream/build/framework# ll
total 44
drwxrwxrwx 3 root root  4096 9月   5 20:34 ./
drwxrwxrwx 7 root root  4096 9月   5 20:34 ../
drwxrwxrwx 3 root root  4096 9月   5 20:34 CMakeFiles/
-rw-rw-rw- 1 root root  1273 9月   5 20:34 cmake_install.cmake
-rw-rw-rw- 1 root root 28336 9月   5 20:34 Makefile
root@ubuntu:/data/chw/nvstream/build/framework# make -j8
[ 13%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/cnstream_collection.cpp.o
[ 26%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/cnstream_graph.cpp.o
[ 26%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/cnstream_frame.cpp.o
[ 13%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/cnstream_config.cpp.o
[ 20%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/cnstream_eventbus.cpp.o
[ 33%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/cnstream_module.cpp.o
[ 40%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/cnstream_source.cpp.o
[ 46%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/cnstream_pipeline.cpp.o
[ 46%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/cnstream_version.cpp.o
[ 53%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/connector.cpp.o
[ 60%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/conveyor.cpp.o
[ 66%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/profiler/module_profiler.cpp.o
[ 73%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/profiler/pipeline_profiler.cpp.o
[ 73%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/profiler/pipeline_tracer.cpp.o
[ 80%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/profiler/process_profiler.cpp.o
[ 86%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/profiler/stream_profiler.cpp.o
[ 93%] Building CXX object framework/CMakeFiles/tnvstream_core.dir/src/profiler/trace_serialize_helper.cpp.o
[100%] Linking CXX shared library /data/chw/nvstream/lib/libtnvstream_core.so
[100%] Built target tnvstream_core

4 编译modules

4.1 atal error: cuda_runtime.h: No such file or directory

bash 复制代码
In file included from /data/chw/nvstream/modules/../infer_server/include/buf_surface_util.hpp:30,
                 from /data/chw/nvstream/modules/../infer_server/include/nvis/processor.h:29,
                 from /data/chw/nvstream/modules/cnstream_preproc.hpp:37,
                 from /data/chw/nvstream/modules/cnstream_preproc.cpp:21:
/data/chw/nvstream/modules/../infer_server/include/common/utils.hpp:31:10: fatal error: cuda_runtime.h: No such file or directory
   31 | #include "cuda_runtime.h"

修改modules/CMakeLists.txt

里面增加

bash 复制代码
# ---[ Compute
find_package(LibCompute)
if(NOT LibCompute_FOUND)
   message(FATAL_ERROR "LibCompute not found!")
endif()



include_directories(${LibCompute_INCLUDE_DIRS})

5 编译app

首先也还是cuda_runtime找不到的问题,修改cmake就可以了

5.1 error: 'BUF_MEMORY_NORMAL' was not declared in this scope; did you mean 'BUF_MEMORY_HOST'?

cpp 复制代码
/data/chw/nvstream/app/preprocess/preprocess_common.cpp: In function 'void SaveResult(const string&, int, uint32_t, infer_server::BufSurfWrapperPtr, const PreprocNetworkInfo&)':
/data/chw/nvstream/app/preprocess/preprocess_common.cpp:109:52: error: 'BUF_MEMORY_NORMAL' was not declared in this scope; did you mean 'BUF_MEMORY_HOST'?
  109 |         if (infer_server::MemcpyHD(cpu_data.get(), BUF_MEMORY_NORMAL, dev_addr, dst_buf->GetMemType(), data_size) != 0) {
      |                                                    ^~~~~~~~~~~~~~~~~
      |                                                    BUF_MEMORY_HOST

这个直接修改代码

5.2 warning: libavformat.so.59, needed by /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so, not found (try using -rpath or -rpath-link)

bash 复制代码
      |                     ^~~~~~~~~
[100%] Linking CXX executable /data/chw/nvstream/app/bin/app
/usr/bin/ld: warning: libavformat.so.59, needed by /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libavcodec.so.59, needed by /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libswscale.so.6, needed by /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libavutil.so.57, needed by /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `avcodec_receive_packet@LIBAVCODEC_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `sws_getCachedContext@LIBSWSCALE_6'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `av_dict_free(AVDictionary**)'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_codec_iterate@LIBAVCODEC_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `avcodec_parameters_copy@LIBAVCODEC_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_write_frame@LIBAVFORMAT_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `avio_close@LIBAVFORMAT_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_frame_alloc@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_bsf_free@LIBAVCODEC_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `sws_freeContext@LIBSWSCALE_6'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_write_trailer@LIBAVFORMAT_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_bsf_alloc@LIBAVCODEC_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `avcodec_find_encoder@LIBAVCODEC_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_free@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `avformat_get_riff_video_tags@LIBAVFORMAT_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `avcodec_send_packet@LIBAVCODEC_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `avcodec_get_name@LIBAVCODEC_59'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `av_frame_free(AVFrame**)'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_hwframe_transfer_data@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_packet_free@LIBAVCODEC_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_malloc@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `avformat_network_init@LIBAVFORMAT_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_hwframe_ctx_alloc@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `av_init_packet(AVPacket*)'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_hwframe_ctx_init@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_freep@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_opt_set@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_log_get_level@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_hwdevice_get_type_name@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_bsf_send_packet@LIBAVCODEC_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_read_frame@LIBAVFORMAT_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_mallocz@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `avformat_new_stream@LIBAVFORMAT_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_bsf_init@LIBAVCODEC_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `avformat_close_input@LIBAVFORMAT_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_hwframe_ctx_create_derived@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `avcodec_receive_frame(AVCodecContext*, AVFrame*)'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `avcodec_close(AVCodecContext*)'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_hwframe_constraints_free@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_dict_free@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_guess_format@LIBAVFORMAT_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_packet_unref@LIBAVCODEC_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_log_set_callback@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_guess_sample_aspect_ratio@LIBAVFORMAT_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_frame_unref@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `avcodec_send_frame@LIBAVCODEC_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_sub_q@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `avcodec_pix_fmt_to_codec_tag@LIBAVCODEC_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_codec_get_id@LIBAVFORMAT_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_dict_get@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_buffer_unref@LIBAVUTIL_57'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `avformat_find_stream_info@LIBAVFORMAT_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `avcodec_find_decoder@LIBAVCODEC_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `sws_scale@LIBSWSCALE_6'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `avcodec_free_context@LIBAVCODEC_59'
/usr/bin/ld: /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/libopencv_videoio.so: undefined reference to `av_hwdevice_ctx_create_derived@LIBAVUTIL_57'

这是因为我编译的jetson-ffmpeg里面ffmpeg库的版本和opencv所需要的ffmpeg库版本有差异造成的,下面图中红框的是opencv需要的,但是我的jetson-ffmpeg比他低一个版本

然后我发现系统根目录的opencv是4.5,然后他用的ffmpeg版本低一个,所以直接用系统根目录下的

bash 复制代码
cp -drf /usr/include/opencv4/opencv2 /data/chw/nvstream/3rdparty/opencv/include/
cd /usr/lib/aarch64-linux-gnu/
mkdir -p  /data/chw/nvstream/3rdparty/opencv/lib/linux_lib
cp -drf libopencv* /data/chw/nvstream/3rdparty/opencv/lib/linux_lib/

然后config脚本里面也修改一下

bash 复制代码
cd ${root}/opencv/lib/linux_lib
\cp ../${arch}/* .

ln -snf libopencv_core.so.4.5.4 libopencv_core.so.4.5
ln -snf libopencv_core.so.4.5 libopencv_core.so

ln -snf libopencv_highgui.so.4.5.4 libopencv_highgui.so.4.5
ln -snf libopencv_highgui.so.4.5 libopencv_highgui.so

ln -snf libopencv_imgproc.so.4.5.4 libopencv_imgproc.so.4.5
ln -snf libopencv_imgproc.so.4.5 libopencv_imgproc.so

ln -snf libopencv_imgcodecs.so.4.5.4 libopencv_imgcodecs.so.4.5
ln -snf libopencv_imgcodecs.so.4.5 libopencv_imgcodecs.so

ln -snf libopencv_video.so.4.5.4 libopencv_video.so.4.5
ln -snf libopencv_video.so.4.5 libopencv_video.so

ln -snf libopencv_videoio.so.4.5.4 libopencv_videoio.so.4.5
ln -snf libopencv_videoio.so.4.5 libopencv_videoio.so

ln -snf libopencv_features2d.so.4.5.4 libopencv_features2d.so.4.5
ln -snf libopencv_features2d.so.4.5 libopencv_features2d.so

ln -snf libopencv_flann.so.4.5.4 libopencv_flann.so.4.5
ln -snf libopencv_flann.so.4.5 libopencv_flann.so

ln -snf libopencv_calib3d.so.4.5.4 libopencv_calib3d.so.4.5
ln -snf libopencv_calib3d.so.4.5 libopencv_calib3d.so

ln -snf libopencv_dnn.so.4.5.4 libopencv_dnn.so.4.5
ln -snf libopencv_dnn.so.4.5 libopencv_dnn.so

5.3 undefined reference to `av_dict_free(AVDictionary**)'

bash 复制代码
/usr/bin/ld: warning: libopencv_core.so.406, needed by /data/chw/nvstream/app/../biz_sdk/lib/linux_lib/libbiz_sdk.so, not found (try using -rpath or -rpath-link)
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `av_dict_free(AVDictionary**)'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `av_frame_free(AVFrame**)'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `av_init_packet(AVPacket*)'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `avcodec_receive_frame(AVCodecContext*, AVFrame*)'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `avcodec_close(AVCodecContext*)'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `avcodec_open2(AVCodecContext*, AVCodec const*, AVDictionary**)'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `avcodec_send_packet(AVCodecContext*, AVPacket const*)'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `avcodec_alloc_context3(AVCodec const*)'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `avcodec_find_decoder(AVCodecID)'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `av_dict_set_int(AVDictionary**, char const*, long, int)'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `avcodec_free_context(AVCodecContext**)'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `av_frame_unref(AVFrame*)'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `av_frame_alloc()'
/usr/bin/ld: /data/chw/nvstream/3rdparty/freetype/lib/linux_lib/libfreetype.so.6: undefined reference to `fstat@GLIBC_2.33'
/usr/bin/ld: /data/chw/nvstream/lib/libnvis.so.1.0.0: undefined reference to `infer_server::AllocHostMem(unsigned long)'
collect2: error: ld returned 1 exit status

这是因为我编译libnvis.so的时候,没有加ffmepg,我在infer_server/CMakeLists.txt中增加

bash 复制代码
# ---[ ffmpeg
find_package(FFmpeg REQUIRED)
if (FFMPEG_FOUND)
  include_directories(${FFMPEG_INCLUDE_DIRS})
  list(APPEND 3RDPARTY_LIBS ${FFMPEG_LIBRARIES})
  message(STATUS "FFmpeg include: ${FFMPEG_INCLUDE_DIRS}")
  message(STATUS "FFmpeg libraries: ${FFMPEG_LIBRARIES}")
else ()
  message(FATAL_ERROR "FFmpeg not found!")
endif ()


.....其他内容......


target_include_directories(nvis PRIVATE
                           ${LibCompute_INCLUDE_DIRS}
                           ${LibCVCuda_INCLUDE_DIRS}
                           ${CMAKE_CURRENT_SOURCE_DIR}/include
                           ${CMAKE_CURRENT_SOURCE_DIR}/src
                           ${GLOG_INCLUDE_DIRS}
                           ${GFLAGS_INCLUDE_DIRS}
                           ${FFMPEG_INCLUDE_DIRS}  # 添加FFmpeg头文件路径
                           )
       
target_link_libraries(nvis PRIVATE ${LibCompute_LIBRARIES} ${LibCVCuda_LIBRARIES} ${GLOG_LIBRARIES} ${FFMPEG_LIBRARIES})

再次编译我看到

bash 复制代码
-- FFmpeg include: /usr/local/include
-- FFmpeg libraries: /usr/local/lib/libavcodec.so;/usr/local/lib/libavformat.so;/usr/local/lib/libavutil.so;/usr/local/lib/libswscale.so;/usr/local/lib/libswresample.so
-- @@@@@@@@@@@ Target : nvis

不对,我不是想让他找系统路径下的,我要让他找我自己的工程路径下的,我看了下cmake/FindFFmpeg.cmake的内容,这个写的有问题

bash 复制代码
# ==============================================
# Try to find FFmpeg libraries:
# - avcodec
# - avformat
# - avdevice
# - avutil
# - swscale
# - avfilter
#
# FFMPEG_FOUND - system has FFmpeg
# FFMPEG_INCLUDE_DIRS - the FFmpeg inc directory
# FFMPEG_LIBRARIES - Link these to use FFmpeg
# ==============================================
# Notice: this original script is from internet.

if (FFMPEG_LIBRARIES AND FFMPEG_INCLUDE_DIRS)
    # in cache already
    set(FFMPEG_FOUND TRUE)
else (FFMPEG_LIBRARIES AND FFMPEG_INCLUDE_DIRS)

    find_path(
            FFMPEG_AVCODEC_INCLUDE_DIR
            NAMES libavcodec/avcodec.h
            PATHS ${_FFMPEG_AVCODEC_INCLUDE_DIRS}
            /usr/include/ffmpeg
            /usr/local/include
			/usr/include/x86_64-linux-gnu 
            ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/include
    )

    find_library(
            FFMPEG_LIBAVCODEC
            NAMES avcodec
            PATHS ${_FFMPEG_AVCODEC_LIBRARY_DIRS}
            /usr/lib64
            /usr/local/lib
            /usr/lib/x86_64-linux-gnu
            ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_lib
    )
  
    find_library(
            FFMPEG_LIBAVFORMAT
            NAMES avformat
            PATHS ${_FFMPEG_AVFORMAT_LIBRARY_DIRS}
            /usr/lib64
            /usr/local/lib
			/usr/lib/x86_64-linux-gnu
            ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_lib
    )
  
    find_library(
            FFMPEG_LIBSWRESAMPLE
            NAMES swresample
            PATHS ${_FFMPEG_SWRESAMPLE_LIBRARY_DIRS}
            /usr/lib64
            /usr/local/lib
			/usr/lib/x86_64-linux-gnu
            ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_lib
    )
 
    find_library(
            FFMPEG_LIBAVUTIL
            NAMES avutil
            PATHS ${_FFMPEG_AVUTIL_LIBRARY_DIRS}
            /usr/lib64
            /usr/local/lib
			/usr/lib/x86_64-linux-gnu
            ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_lib
    )

    find_library(
            FFMPEG_LIBSWSCALE
            NAMES swscale
            PATHS ${_FFMPEG_SWSCALE_LIBRARY_DIRS}
            /usr/lib64
            /usr/local/lib
			/usr/lib/x86_64-linux-gnu
            ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_lib
    )

    find_library(
            FFMPEG_LIBAVFILTER
            NAMES avfilter
            PATHS ${_FFMPEG_AVFILTER_LIBRARY_DIRS}
            /usr/lib64
            /usr/local/lib
			/usr/lib/x86_64-linux-gnu
            ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_lib
    )
    find_library(
            FFMPEG_LIBAVDEVICE
            NAMES avdevice
            PATHS ${_FFMPEG_AVDEVICE_LIBRARY_DIRS}
            /usr/lib64
            /usr/local/lib
            /usr/lib/x86_64-linux-gnu
            ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_lib
    )
  if (WITH_FFMPEG_AVDEVICE AND NOT FFMPEG_LIBAVDEVICE)
    message(FATAL_ERROR "Not find FFmpeg LIBAVDEVICE ")
  endif ()
  if (FFMPEG_LIBAVCODEC AND FFMPEG_LIBAVFORMAT AND FFMPEG_LIBAVUTIL AND FFMPEG_LIBSWSCALE AND FFMPEG_LIBSWRESAMPLE AND (FFMPEG_LIBAVDEVICE OR NOT WITH_FFMPEG_AVDEVICE))
        set(FFMPEG_FOUND TRUE)
  endif ()

    if (FFMPEG_FOUND)
        set(FFMPEG_INCLUDE_DIRS ${FFMPEG_AVCODEC_INCLUDE_DIR})
        set(FFMPEG_LIBRARIES
                ${FFMPEG_LIBAVCODEC}
                ${FFMPEG_LIBAVFORMAT}
                ${FFMPEG_LIBAVUTIL}
                ${FFMPEG_LIBSWSCALE}
                ${FFMPEG_LIBSWRESAMPLE})
        if (WITH_FFMPEG_AVDEVICE)
          list(APPEND FFMPEG_LIBRARIES ${FFMPEG_LIBAVDEVICE})
        endif (WITH_FFMPEG_AVDEVICE)
    else (FFMPEG_FOUND)
        message(FATAL_ERROR "Could not find FFmpeg libraries!")
    endif (FFMPEG_FOUND)

endif (FFMPEG_LIBRARIES AND FFMPEG_INCLUDE_DIRS)

这里面直接就是系统路径下的,那不对,我要让他找我自己路径下的,于是修改它

bash 复制代码
# ==============================================
# Try to find FFmpeg libraries:
# - avcodec
# - avformat
# - avdevice
# - avutil
# - swscale
# - avfilter
#
# FFMPEG_FOUND - system has FFmpeg
# FFMPEG_INCLUDE_DIRS - the FFmpeg inc directory
# FFMPEG_LIBRARIES - Link these to use FFmpeg
# ==============================================
# Notice: this original script is from internet.

if (FFMPEG_LIBRARIES AND FFMPEG_INCLUDE_DIRS)
    # in cache already
    set(FFMPEG_FOUND TRUE)
else (FFMPEG_LIBRARIES AND FFMPEG_INCLUDE_DIRS)

   	find_path(LibFFMPEG_ROOT_DIR
		NAMES include/libavcodec/avcodec.h
		PATHS ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg
		NO_DEFAULT_PATH
	)	
   
    find_path(LibFFMEPG_INCLUDE_DIR
        NAMES libavcodec/avcodec.h
        PATHS ${LibFFMPEG_ROOT_DIR}/include
        NO_DEFAULT_PATH
    )

    find_library(FFMPEG_LIBAVCODEC
            NAMES avcodec
            PATHS ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_lib
            NO_DEFAULT_PATH
    )
  
    find_library(
            FFMPEG_LIBAVFORMAT
            NAMES avformat
            PATHS ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_lib
            NO_DEFAULT_PATH
    )
  
    find_library(
            FFMPEG_LIBSWRESAMPLE
            NAMES swresample
            PATHS ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_lib
            NO_DEFAULT_PATH
    )
 
    find_library(
            FFMPEG_LIBAVUTIL
            NAMES avutil
            PATHS ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_lib
            NO_DEFAULT_PATH
    )

    find_library(
            FFMPEG_LIBSWSCALE
            NAMES swscale
            PATHS ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_lib
            NO_DEFAULT_PATH
    )

    find_library(
            FFMPEG_LIBAVFILTER
            NAMES avfilter
            PATHS ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_lib
            NO_DEFAULT_PATH
    )
    find_library(
            FFMPEG_LIBAVDEVICE
            NAMES avdevice
            PATHS ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_lib
            NO_DEFAULT_PATH
    )
  if (WITH_FFMPEG_AVDEVICE AND NOT FFMPEG_LIBAVDEVICE)
    message(FATAL_ERROR "Not find FFmpeg LIBAVDEVICE ")
  endif ()
  if (FFMPEG_LIBAVCODEC AND FFMPEG_LIBAVFORMAT AND FFMPEG_LIBAVUTIL AND FFMPEG_LIBSWSCALE AND FFMPEG_LIBSWRESAMPLE AND (FFMPEG_LIBAVDEVICE OR NOT WITH_FFMPEG_AVDEVICE))
        set(FFMPEG_FOUND TRUE)
  endif ()

    if (FFMPEG_FOUND)
        set(FFMPEG_INCLUDE_DIRS ${LibFFMEPG_INCLUDE_DIR})
        set(FFMPEG_LIBRARIES
                ${FFMPEG_LIBAVCODEC}
                ${FFMPEG_LIBAVFORMAT}
                ${FFMPEG_LIBAVUTIL}
                ${FFMPEG_LIBSWSCALE}
                ${FFMPEG_LIBSWRESAMPLE})
        if (WITH_FFMPEG_AVDEVICE)
          list(APPEND FFMPEG_LIBRARIES ${FFMPEG_LIBAVDEVICE})
        endif (WITH_FFMPEG_AVDEVICE)
    else (FFMPEG_FOUND)
        message(FATAL_ERROR "Could not find FFmpeg libraries!")
    endif (FFMPEG_FOUND)

endif (FFMPEG_LIBRARIES AND FFMPEG_INCLUDE_DIRS)

这里面最开始还有下面的

bash 复制代码
-- FFmpeg include: LibFFMEPG_INCLUDE_DIR-NOTFOUND
-- FFmpeg libraries: /data/chw/nvstream/3rdparty/ffmpeg/lib/linux_lib/libavcodec.so;/data/chw/nvstream/3rdparty/ffmpeg/lib/linux_lib/libavformat.so;/data/chw/nvstream/3rdparty/ffmpeg/lib/linux_lib/libavutil.so;/data/chw/nvstream/3rdparty/ffmpeg/lib/linux_lib/libswscale.so;/data/chw/nvstream/3rdparty/ffmpeg/lib/linux_lib/libswresample.so
-- @@@@@@@@@@@ Target : nvis
-- Configuring done (1.2s)
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
LibFFMEPG_INCLUDE_DIR
   used as include directory in directory /data/chw/nvstream/infer_server
   used as include directory in directory /data/chw/nvstream/infer_server
   used as include directory in directory /data/chw/nvstream/infer_server

CMake Error in CMakeLists.txt:
  Found relative path while evaluating include directories of "nvis":

    "LibFFMEPG_INCLUDE_DIR-NOTFOUND"

这是因为cmake/FindFFmpeg.cmake里面NAMES include/libavcodec/avcodec.h写成了NAMES inculde/libavcodec/avcodec.h

我这样修改之后再次编译,然后发现

bash 复制代码
cmake -DCMAKE_BUILD_TYPE=Debug ..
-- FFmpeg include: /data/chw/nvstream/3rdparty/ffmpeg/include
-- FFmpeg libraries: /data/chw/nvstream/3rdparty/ffmpeg/lib/linux_lib/libavcodec.so;/data/chw/nvstream/3rdparty/ffmpeg/lib/linux_lib/libavformat.so;/data/chw/nvstream/3rdparty/ffmpeg/lib/linux_lib/libavutil.so;/data/chw/nvstream/3rdparty/ffmpeg/lib/linux_lib/libswscale.so;/data/chw/nvstream/3rdparty/ffmpeg/lib/linux_lib/libswresample.so
-- @@@@@@@@@@@ Target : nvis
-- FFmpeg libraries: /data/chw/nvstream/3rdparty/ffmpeg/lib/linux_lib/libavcodec.so;/data/chw/nvstream/3rdparty/ffmpeg/lib/linux_lib/libavformat.so;/data/chw/nvstream/3rdparty/ffmpeg/lib/linux_lib/libavutil.so;/data/chw/nvstream/3rdparty/ffmpeg/lib/linux_lib/libswscale.so;/data/chw/nvstream/3rdparty/ffmpeg/lib/linux_lib/libswresample.so
-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: /data/chw/nvstream/infer_server/build

已经能找到我自己路径下的库了,可是我编译完之后

bash 复制代码
ldd  /data/chw/nvstream/lib/libnvis.so.1.0.0 
	linux-vdso.so.1 (0x0000ffff99206000)
	libcudart.so.11.0 => /data/chw/nvstream/3rdparty/jetson/compute/lib/linux_lib/libcudart.so.11.0 (0x0000ffff98ef4000)
	libtrteng_exp.so => /data/chw/nvstream/3rdparty/jetson/compute/lib/linux_lib/libtrteng_exp.so (0x0000ffff98c35000)
	libcuda_utils.so => /data/chw/nvstream/3rdparty/jetson/compute/lib/linux_lib/libcuda_utils.so (0x0000ffff98b7f000)
	libcvcuda.so.0 => /opt/nvidia/cvcuda0/lib/aarch64-linux-gnu/libcvcuda.so.0 (0x0000ffff91e07000)
	libnvcv_types.so.0 => /opt/nvidia/cvcuda0/lib/aarch64-linux-gnu/libnvcv_types.so.0 (0x0000ffff91c61000)
	libglog.so.0 => /data/chw/nvstream/3rdparty/glog/lib/linux_lib/libglog.so.0 (0x0000ffff91c21000)
	libstdc++.so.6 => /lib/aarch64-linux-gnu/libstdc++.so.6 (0x0000ffff919ba000)
	libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000ffff91991000)
	libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffff9181e000)
	/lib/ld-linux-aarch64.so.1 (0x0000ffff991d6000)
	libdl.so.2 => /lib/aarch64-linux-gnu/libdl.so.2 (0x0000ffff9180a000)
	libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000ffff917d9000)
	librt.so.1 => /lib/aarch64-linux-gnu/librt.so.1 (0x0000ffff917c1000)
	libnvinfer.so.8 => /lib/aarch64-linux-gnu/libnvinfer.so.8 (0x0000ffff84668000)
	libnvinfer_plugin.so.8 => /lib/aarch64-linux-gnu/libnvinfer_plugin.so.8 (0x0000ffff83245000)
	libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000ffff8319a000)
	libcusolver.so.11 => /usr/local/cuda/targets/aarch64-linux/lib/libcusolver.so.11 (0x0000ffff7603c000)
	libnvdla_compiler.so => /usr/lib/aarch64-linux-gnu/tegra/libnvdla_compiler.so (0x0000ffff75901000)
	libcudla.so.1 => /usr/local/cuda/targets/aarch64-linux/lib/libcudla.so.1 (0x0000ffff758c4000)
	libcublas.so.11 => /usr/local/cuda/targets/aarch64-linux/lib/libcublas.so.11 (0x0000ffff6b7eb000)
	libcublasLt.so.11 => /usr/local/cuda/targets/aarch64-linux/lib/libcublasLt.so.11 (0x0000ffff5424a000)
	libcudnn.so.8 => /lib/aarch64-linux-gnu/libcudnn.so.8 (0x0000ffff54213000)
	libnvos.so => /usr/lib/aarch64-linux-gnu/tegra/libnvos.so (0x0000ffff541f3000)
	libnvdla_runtime.so => /usr/lib/aarch64-linux-gnu/tegra/libnvdla_runtime.so (0x0000ffff53b9b000)
	libcuda.so.1 => /usr/lib/aarch64-linux-gnu/tegra/libcuda.so.1 (0x0000ffff52544000)
	libnvrm_host1x.so => /usr/lib/aarch64-linux-gnu/tegra/libnvrm_host1x.so (0x0000ffff52523000)
	libnvrm_mem.so => /usr/lib/aarch64-linux-gnu/tegra/libnvrm_mem.so (0x0000ffff5250b000)
	libnvsocsys.so => /usr/lib/aarch64-linux-gnu/tegra/libnvsocsys.so (0x0000ffff524f7000)
	libnvrm_gpu.so => /usr/lib/aarch64-linux-gnu/tegra/libnvrm_gpu.so (0x0000ffff5248a000)
	libnvrm_sync.so => /usr/lib/aarch64-linux-gnu/tegra/libnvrm_sync.so (0x0000ffff52473000)
	libnvrm_chip.so => /usr/lib/aarch64-linux-gnu/tegra/libnvrm_chip.so (0x0000ffff5245f000)
	libnvsciipc.so => /usr/lib/aarch64-linux-gnu/tegra/libnvsciipc.so (0x0000ffff5243a000)

根本就没有ffmepg的库呀。原因在于我的代码中,包含头文件的时候,没有加extern C,改成下面这样的

bash 复制代码
#ifdef __cplusplus
extern "C" {
#endif
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/avutil.h>
#ifdef __cplusplus
}
#endif

然后再次编译出来的库就会依赖FFmpeg了。

5.4 /data/chw/nvstream/3rdparty/freetype/lib/linux_lib/libfreetype.so.6: undefined reference to `fstat@GLIBC_2.33'

这种错误很明显就是版本问题了,我现在的工程目录下的文件是6.18的

bash 复制代码
/data/chw/nvstream/3rdparty/freetype/lib/aarch64/libfreetype.so.6.18.1
/data/chw/nvstream/3rdparty/freetype/lib/aarch64/libfreetype.so.6.14.0_backup
/data/chw/nvstream/3rdparty/freetype/lib/linux_lib/libfreetype.so.6
/data/chw/nvstream/3rdparty/freetype/lib/linux_lib/libfreetype.so.6.18.1
/data/chw/nvstream/3rdparty/freetype/lib/linux_lib/libfreetype.so.6.14.0

但是系统目录下的是6.17的

bash 复制代码
/usr/lib/aarch64-linux-gnu/libfreetype.so.6
/usr/lib/aarch64-linux-gnu/libfreetype.so.6.17.1

所以把系统路径的拷贝过来,

bash 复制代码
cp  /usr/lib/aarch64-linux-gnu/libfreetype.so.6.17.1 /data/chw/nvstream/3rdparty/freetype/lib/aarch64/

并且修改config脚本的内容

bash 复制代码
ln -snf libfreetype.so.6.17.1 libfreetype.so.6
ln -snf libfreetype.so.6 libfreetype.so

参考文献:

在NVIDIA Jetson AGX Orin中使用jetson-ffmpeg调用硬件编解码加速处理-CSDN博客

NVIDIA Jetson AGX Orin源码编译安装CV-CUDA-CSDN博客

GitHub - Cambricon/CNStream: CNStream is a streaming framework for building Cambricon machine learning pipelines http://forum.cambricon.com https://gitee.com/SolutionSDK/CNStream

easydk/samples/simple_demo/common/video_decoder.cpp at master · Cambricon/easydk · GitHub

aclStream流处理多路并发Pipeline框架中 视频解码 代码调用流程整理、类的层次关系整理、回调函数赋值和调用流程整理-CSDN博客

aclStream流处理多路并发Pipeline框架中VEncode Module代码调用流程整理、类的层次关系整理、回调函数赋值和调用流程整理-CSDN博客

FFmpeg/doc/examples at master · FFmpeg/FFmpeg · GitHub

GitHub - CVCUDA/CV-CUDA: CV-CUDA™ is an open-source, GPU accelerated library for cloud-scale image processing and computer vision.

如何使用FFmpeg的解码器---FFmpeg API教程 · FFmpeg原理

C++ API --- CV-CUDA Beta documentation (cvcuda.github.io)

CV-CUDA/tests/cvcuda/system at main · CVCUDA/CV-CUDA · GitHub

Resize --- CV-CUDA Beta documentation

CUDA Runtime API :: CUDA Toolkit Documentation

CUDA Toolkit Documentation 12.6 Update 1

完整指南:CNStream流处理多路并发框架适配到NVIDIA Jetson Orin (一) 依赖库编译、第三方库编译安装-CSDN博客

完整指南:CNStream流处理多路并发框架适配到NVIDIA Jetson Orin (二) 源码架构流程梳理、代码编写-CSDN博客

相关推荐
成富6 分钟前
文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现
数据库·人工智能·sql·spring·oracle
CSDN云计算19 分钟前
如何以开源加速AI企业落地,红帽带来新解法
人工智能·开源·openshift·红帽·instructlab
ULTRA??22 分钟前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
艾派森30 分钟前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
hairenjing112332 分钟前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
小蜗子36 分钟前
Multi‐modal knowledge graph inference via media convergenceand logic rule
人工智能·知识图谱
SpikeKing1 小时前
LLM - 使用 LLaMA-Factory 微调大模型 环境配置与训练推理 教程 (1)
人工智能·llm·大语言模型·llama·环境配置·llamafactory·训练框架
凌云行者1 小时前
OpenGL入门005——使用Shader类管理着色器
c++·cmake·opengl
凌云行者1 小时前
OpenGL入门006——着色器在纹理混合中的应用
c++·cmake·opengl
黄焖鸡能干四碗1 小时前
信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)
大数据·人工智能·软件需求·设计规范·规格说明书