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

目录

1 infer_server编译

1.1 infer_server/CMakeLists.txt修改

1.2 FindLibCompute.cmake编写

1.2 findLibCVCuda.cmake编写

1.3 ./3rdparty/config_lib_aarch64.sh修改

1.4 解决各种编译错误

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.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.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.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’?

2 整体工程cmake

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

3 编译framework

4 编译modules

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

5 编译app

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.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'

参考文献:


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

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

1 infer_server编译

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

1.1 infer_server/CMakeLists.txt修改

cmake_minimum_required(VERSION 3.5)# ---[ nvis project
project(nvis C CXX)#######################################################################
# -- Build Flagsoption(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编写

# - 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 headersfind_path(LibCompute_ROOT_DIRNAMES include/export_funtions.hPATHS ${CNSTREAM_ROOT_PATH}/3rdparty/jetson/compute
)find_path(LibCompute_INCLUDE_DIRSNAMES export_funtions.hPATHS ${LibCompute_ROOT_DIR}/include
)find_path(LibCompute_CUDA_INCLUDE_DIRSNAMES cuda_runtime.hPATHS ${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_libNO_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编写

# - 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 headersfind_path(LibCVCuda_ROOT_DIRNAMES include/cvcuda/Version.hPATHS ${CNSTREAM_ROOT_PATH}/3rdparty/jetson/cvcuda
)find_path(LibCVCuda_INCLUDE_DIRSNAMES cvcuda/Version.hPATHS ${LibCVCuda_ROOT_DIR}/include
)find_library(LibCVCuda_LIBRARIESNAMES cvcudaPATHS ${LibCVCuda_ROOT_DIR}/lib/linux_lib
)find_library(LibNVCV_Types_LIBRARIESNAMES nvcv_typesPATHS ${LibCVCuda_ROOT_DIR}/lib/linux_lib
)if (LibCVCuda_LIBRARIES)list(APPEND LibCVCuda_LIBRARIES ${LibNVCV_Types_LIBRARIES})set(LibCVCuda_FOUND TRUE)
endif ()

然后直接

cd /data/chw/nvstream/infer_server/build
cmake -DCMAKE_BUILD_TYPE=Debug ..
make -j4

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

1.3 ./3rdparty/config_lib_aarch64.sh修改

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

#!/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.soln -snf libcublasLt.so.11.6.6.84 libcublasLt.so.11
ln -snf libcublasLt.so.11 libcublasLt.soln -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.soln -snf libcurand.so.10.2.5.297 libcurand.so.10
ln -snf libcurand.so.10 libcurand.soln -snf libnvrtc.so.11.4.300 libnvrtc.so.11
ln -snf libnvrtc.so.11 libnvrtc.soln -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.soln -snf libcudnn_ops_infer.so.8.6.0 libcudnn_ops_infer.so.8
ln -snf libcudnn_ops_infer.so.8 libcudnn_ops_infer.soln -snf libcudnn_cnn_infer.so.8.6.0 libcudnn_cnn_infer.so.8
ln -snf libcudnn_cnn_infer.so.8 libcudnn_cnn_infer.soln -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.soln -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.soln -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.soln -snf libavdevice.so.58.13.100 libavdevice.so.58
ln -snf libavdevice.so.58 libavdevice.soln -snf libavfilter.so.7.110.100 libavfilter.so.7
ln -snf libavfilter.so.7 libavfilter.soln -snf libavformat.so.58.76.100 libavformat.so.58
ln -snf libavformat.so.58 libavformat.soln -snf libavutil.so.56.70.100 libavutil.so.56
ln -snf libavutil.so.56 libavutil.soln -snf libswresample.so.3.9.100 libswresample.so.3
ln -snf libswresample.so.3 libswresample.soln -snf libswscale.so.5.9.100 libswscale.so.5
ln -snf libswscale.so.5 libswscale.soln -snf libnvmpi.so.1.0.0 libnvmpi.so.1
ln -snf libnvmpi.so.1 libnvmpi.soln -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.soln -snf libopencv_highgui.so.4.6.0 libopencv_highgui.so.406
ln -snf libopencv_highgui.so.406 libopencv_highgui.soln -snf libopencv_imgproc.so.4.6.0 libopencv_imgproc.so.406
ln -snf libopencv_imgproc.so.406 libopencv_imgproc.soln -snf libopencv_imgcodecs.so.4.6.0 libopencv_imgcodecs.so.406
ln -snf libopencv_imgcodecs.so.406 libopencv_imgcodecs.soln -snf libopencv_video.so.4.6.0 libopencv_video.so.406
ln -snf libopencv_video.so.406 libopencv_video.soln -snf libopencv_videoio.so.4.6.0 libopencv_videoio.so.406
ln -snf libopencv_videoio.so.406 libopencv_videoio.soln -snf libopencv_features2d.so.4.6.0 libopencv_features2d.so.406
ln -snf libopencv_features2d.so.406 libopencv_features2d.soln -snf libopencv_flann.so.4.6.0 libopencv_flann.so.406
ln -snf libopencv_flann.so.406 libopencv_flann.soln -snf libopencv_calib3d.so.4.6.0 libopencv_calib3d.so.406
ln -snf libopencv_calib3d.so.406 libopencv_calib3d.soln -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.soln -snf libpaho-mqtt3a.so.1.3.8 libpaho-mqtt3a.so.1
ln -snf libpaho-mqtt3a.so.1 libpaho-mqtt3a.soln -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

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 type259 |     pair<_FIter, _FIter>|     ^~~~
/usr/include/c++/11/bits/algorithmfwd.h:264:5: error: ‘pair’ does not name a type264 |     pair<_FIter, _FIter>|     ^~~~
/usr/include/c++/11/bits/algorithmfwd.h:432:5: error: ‘pair’ does not name a type432 |     pair<const _Tp&, const _Tp&>|     ^~~~
/usr/include/c++/11/bits/algorithmfwd.h:437:5: error: ‘pair’ does not name a type437 |     pair<const _Tp&, const _Tp&>|     ^~~~
/usr/include/c++/11/bits/algorithmfwd.h:442:5: error: ‘pair’ does not name a type442 |     pair<_FIter, _FIter>|     ^~~~
/usr/include/c++/11/bits/algorithmfwd.h:447:5: error: ‘pair’ does not name a type447 |     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 declaration453 |     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

/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); });

修改代码

//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

/************************************************************************** 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 ## cclass _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*)’

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

#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 decoderif (!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 codecreate_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’?

写错了,修改一下定义

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


#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

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

直接删掉

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

3 编译framework

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

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

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 directory31 | #include "cuda_runtime.h"

修改modules/CMakeLists.txt

里面增加

# ---[ 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’?

/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)

      |                     ^~~~~~~~~
[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版本低一个,所以直接用系统根目录下的

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脚本里面也修改一下

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.soln -snf libopencv_highgui.so.4.5.4 libopencv_highgui.so.4.5
ln -snf libopencv_highgui.so.4.5 libopencv_highgui.soln -snf libopencv_imgproc.so.4.5.4 libopencv_imgproc.so.4.5
ln -snf libopencv_imgproc.so.4.5 libopencv_imgproc.soln -snf libopencv_imgcodecs.so.4.5.4 libopencv_imgcodecs.so.4.5
ln -snf libopencv_imgcodecs.so.4.5 libopencv_imgcodecs.soln -snf libopencv_video.so.4.5.4 libopencv_video.so.4.5
ln -snf libopencv_video.so.4.5 libopencv_video.soln -snf libopencv_videoio.so.4.5.4 libopencv_videoio.so.4.5
ln -snf libopencv_videoio.so.4.5 libopencv_videoio.soln -snf libopencv_features2d.so.4.5.4 libopencv_features2d.so.4.5
ln -snf libopencv_features2d.so.4.5 libopencv_features2d.soln -snf libopencv_flann.so.4.5.4 libopencv_flann.so.4.5
ln -snf libopencv_flann.so.4.5 libopencv_flann.soln -snf libopencv_calib3d.so.4.5.4 libopencv_calib3d.so.4.5
ln -snf libopencv_calib3d.so.4.5 libopencv_calib3d.soln -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**)'

/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中增加

# ---[ 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})

再次编译我看到

-- 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的内容,这个写的有问题

# ==============================================
# 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 alreadyset(FFMPEG_FOUND TRUE)
else (FFMPEG_LIBRARIES AND FFMPEG_INCLUDE_DIRS)find_path(FFMPEG_AVCODEC_INCLUDE_DIRNAMES libavcodec/avcodec.hPATHS ${_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_LIBAVCODECNAMES avcodecPATHS ${_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_LIBAVFORMATNAMES avformatPATHS ${_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_LIBSWRESAMPLENAMES swresamplePATHS ${_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_LIBAVUTILNAMES avutilPATHS ${_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_LIBSWSCALENAMES swscalePATHS ${_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_LIBAVFILTERNAMES avfilterPATHS ${_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_LIBAVDEVICENAMES avdevicePATHS ${_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)

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

# ==============================================
# 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 alreadyset(FFMPEG_FOUND TRUE)
else (FFMPEG_LIBRARIES AND FFMPEG_INCLUDE_DIRS)find_path(LibFFMPEG_ROOT_DIRNAMES include/libavcodec/avcodec.hPATHS ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpegNO_DEFAULT_PATH)	find_path(LibFFMEPG_INCLUDE_DIRNAMES libavcodec/avcodec.hPATHS ${LibFFMPEG_ROOT_DIR}/includeNO_DEFAULT_PATH)find_library(FFMPEG_LIBAVCODECNAMES avcodecPATHS ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_libNO_DEFAULT_PATH)find_library(FFMPEG_LIBAVFORMATNAMES avformatPATHS ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_libNO_DEFAULT_PATH)find_library(FFMPEG_LIBSWRESAMPLENAMES swresamplePATHS ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_libNO_DEFAULT_PATH)find_library(FFMPEG_LIBAVUTILNAMES avutilPATHS ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_libNO_DEFAULT_PATH)find_library(FFMPEG_LIBSWSCALENAMES swscalePATHS ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_libNO_DEFAULT_PATH)find_library(FFMPEG_LIBAVFILTERNAMES avfilterPATHS ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_libNO_DEFAULT_PATH)find_library(FFMPEG_LIBAVDEVICENAMES avdevicePATHS ${CNSTREAM_ROOT_PATH}/3rdparty/ffmpeg/lib/linux_libNO_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)

这里面最开始还有下面的

-- 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_DIRused as include directory in directory /data/chw/nvstream/infer_serverused as include directory in directory /data/chw/nvstream/infer_serverused as include directory in directory /data/chw/nvstream/infer_serverCMake 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

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

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

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

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,改成下面这样的

#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的

/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的

/usr/lib/aarch64-linux-gnu/libfreetype.so.6
/usr/lib/aarch64-linux-gnu/libfreetype.so.6.17.1

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

cp  /usr/lib/aarch64-linux-gnu/libfreetype.so.6.17.1 /data/chw/nvstream/3rdparty/freetype/lib/aarch64/

并且修改config脚本的内容

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博客

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

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

相关文章

OpenCV-轮廓检测

文章目录 一、简介1. 意义2.具体步骤 二、代码实现三、总结 一、简介 1. 意义 在OpenCV中&#xff0c;轮廓检测是图像处理中一个非常重要的环节&#xff0c;它允许我们识别图像中的形状。这个过程通常涉及几个步骤&#xff1a;读取图像、转换为灰度图、应用阈值处理&#xff…

Django发送邮件

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 Django 5框架Web应用开发_夏天又到了的博客-CSDN博客 本文学习怎么使用Django发送邮件。 尽管使用Python的smtplib模块发送电子邮件…

Go语言概述

1.Go语言的特点 1&#xff09;从语言层面支持并发&#xff0c;实现简单 2&#xff09;goroutine&#xff0c;轻量级线程&#xff0c;可实现大并发处理&#xff0c;高效利用多核 3&#xff09;垃圾回收机制&#xff0c;内存自动回收&#xff0c;不需要开发人员管理 4&#xff0…

2024年10款好用的图纸加密软件推荐|企业图纸的守护神

在数字化时代&#xff0c;图纸数据的安全性是企业不可忽视的重要任务。随着技术的不断进步&#xff0c;图纸加密软件成为了保护企业知识产权和敏感数据的关键工具。以下是2024年推荐的10款好用的图纸加密软件&#xff0c;它们各具特色&#xff0c;能够满足不同企业的需求。 1.…

SpringBoot大学生租房平台:技术实现与市场分析

第2章 开发环境与技术 大学生租房平台的编码实现需要搭建一定的环境和使用相应的技术&#xff0c;接下来的内容就是对大学生租房平台用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的&#xff0c;是经常变动的&#xff0c;没有办…

【南京工业大学主办,JPCS出版】自动化、电气控制系统与设备

&#x1f308;2024年自动化、电气控制系统与设备国际学术会议&#xff08;AECSE 2024&#xff09;是致力于将“自动化与电气”领域的专家学者、研发者和技术人员汇集一堂的国际盛会。会议将于2024年10月18-20日在中国南京举行。 &#x1f308;会议的主旨是为相关领域的从业者及…

log4j日志封装说明—slf4j对于log4j的日志封装-正确获取调用堆栈

日志是项目中必用的东西&#xff0c;日志产品里最普及应该就是log4j了。(logback这里暂不讨论。) 先看一下常用的log4j的用法&#xff0c;一般来说log4j都会配合slf4j或者common-logging使用&#xff0c;这里已slf4j为例。添加gradle依赖&#xff1a; dependencies { compile(l…

zookeeper是啥?在kafka中有什么作用

一、Zookeeper是啥 问AI&#xff0c;它是这么说&#xff1a; ZooKeeper是一个开源的分布式协调服务。 ZooKeeper最初由雅虎研究院开发&#xff0c;用于解决大型分布式系统中的协调问题&#xff0c;特别是为了避免分布式单点故障。它被设计成一个简单易用的接口集&#xff0c;封…

Untiy TTF转换为SDF

Untiy TTF转换为SDF 原因 下载的字体是TTF格式&#xff0c;但是TMP使用的是SDF格式&#xff0c;不支持TTF&#xff0c;需要转换网络没有检索到TTF转SDF的教程&#xff0c;可能是太简单了&#xff0c;自己记录一下吧 Unity内转换即可 在Asset中找到自己的TTF右键点击TTF&…

团队氛围评估模型:忍耐度模型(心理调适度行为调适度)

通过“忍耐度模型”对团队氛围进行评估&#xff0c;可以清晰地反映出不同员工的心理状态和行为模式&#xff0c;进而可以采取有针对性的管理措施来优化团队氛围和提升团队绩效。 X轴&#xff1a;心理调适度&#xff0c;随坐标轴方向表示从低到高&#xff1b;Y轴&#xff1a;行…

汽车驾驶屏HMI,设计颜值相当拉风, 怪不的大家都喜欢呀。

hell&#xff0c;大家好&#xff0c;本期为大家带来汽车驾驶仪表盘的设计&#xff0c;尽管平时碰到设计汽车HMI的场景比较少&#xff0c;但是看到如此精彩和充满创意的设计&#xff0c;对于设计师水平提升也是十分有帮助的。

SpringBoot 集成 PDFBox 实现电子签章

Apache PDFBox 是一个开源的 Java 库&#xff0c;用于处理 PDF 文档。它提供了一系列强大的功能&#xff0c;包括创建、渲染、拆分、合并、加密、解密 PDF 文件&#xff0c;以及从 PDF 中提取文本和元数据等。PDFBox 支持 PDF 1.7 标准&#xff0c;并且兼容大多数现代 PDF 格式…

CMDB是什么软件?对企业有什么用?

配置管理数据库缩写为CMDB&#xff0c;英文全称为Configuration Management Database&#xff0c;是一种用于记录和管理企业信息技术基础设施&#xff08;IT基础设施&#xff09;和所有相关资源的数据库软件。 CMDB的主要功能是收集、存储和分析所有IT基础设施和服务的信息&am…

【C语言】选择排序及优化、冒泡排序、计数排序的实现

目录 一、选择排序1.1 常规版&#xff08;一次排好一个数&#xff09;1.1.1 基本思想1.1.2 实现思路1.1.3 代码 1.2 优化版&#xff08;一次排好两个数&#xff09;1.2.1 实现思路1.2.2 代码 1.3 时间复杂度 二、冒泡排序2.1 实现思路2.2 代码2.3 时间复杂度 三、计数排序3.1 基…

56页PPT | 大数据决策分析平台怎么建设?经典实践方案推荐

一、现状和目标 企业用户现状&#xff1a;数据分散&#xff0c;利用率低&#xff0c;业务需求变化快但IT响应慢。 问题&#xff1a;数据展示不及时、不准确&#xff0c;缺乏深入分析工具&#xff0c;报表制作效率低下。 目标&#xff1a;建设统一的数据整合平台&#xff0c;…

GS-SLAM论文阅读笔记--MM-Gaussian

介绍 这是一篇多模态的GS-SLAM&#xff0c;也已经被IROS2024录用。由于多传感器融合的GS-SLAM还是比较少的&#xff0c;所以应该仔细阅读一篇。 文章目录 介绍1.背景介绍2.关键内容2.1 跟踪2.2 重定位2.3 建图2.4总体流程 3.文章贡献 1.背景介绍 传统的SLAM方法往往受到地图…

Patch 35586779: WLS PATCH SET UPDATE 10.3.6.0.231017

以上补丁请自行去oracle官网下载&#xff0c;需要技术支持的请联系&#xff1a;https://item.taobao.com/item.htm?spm2013.1.w4023-17257245948.4.19611db9bzrKBx&id608692494369

软件质量保障:故障演练介绍

目录 背景&#xff1a;架构变化带来的问题 什么是故障演练 为什么需要故障演练 故障演练场景有哪些 不同演练类型和目标 如何对工具进行评估 功能评测项 告警评测项 观测指标评测项 总结 背景&#xff1a;架构变化带来的问题 随着架构越来越复杂、应用越来越多样&…

【设计模式】Template Method伪代码

1. 不好的代码 1.1 lib.cpp class Library{ public:void Step1(){//...}void Step3(){//...}void Step5(){//...} };1.2 app.cpp class Application{ public:bool Step2(){//...}void Step4(){//...} };int main() {Library lib();Application app();lib.Step1();if(app.Ste…

Python 从入门到实战12(流程控制-跳出循环语句)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了流程控制语句中的循环语句。今天继续讨…