解决在Ubuntu系统下使用运行Lucid 相机(HTR003S-001)相应实例出现的依赖库缺失的问题

张开发
2026/4/16 22:40:44 15 分钟阅读

分享文章

解决在Ubuntu系统下使用运行Lucid 相机(HTR003S-001)相应实例出现的依赖库缺失的问题
https://blog.csdn.net/m0_46090849/article/details/160031386?sharetypeblogdetailsharerId160031386sharereferPCsharesourcem0_46090849spm1011.2480.3001.8118这篇文章讲了如何在ubuntu20.04中使用ArenaView MP虽然已经运行成功但是发现想要编译并运行C实例还是遇到了一些问题。问题一编译链接阶段-间接依赖库缺失错误现象rootyygpc:/opt/arena/ArenaSDK_Linux_x64/Examples/Arena/Cpp_Acquisition# makeg -L../../../lib64 -L../../../GenICam/library/lib/Linux64_x64 -L../../../ffmpeg -L../../../OpenCV/lib -lopencv_calib3d -lopencv_core -lopencv_features2d -lopencv_highgui -lopencv_imgproc -lopencv_video Cpp_Acquisition.o stdafx.o -o Cpp_Acquisition -larena -lsave -lgentl -lGCBase_gcc54_v3_3_LUCID -lGenApi_gcc54_v3_3_LUCID -lLog_gcc54_v3_3_LUCID -llog4cpp_gcc54_v3_3_LUCID -lMathParser_gcc54_v3_3_LUCID -lNodeMapData_gcc54_v3_3_LUCID -lXmlParser_gcc54_v3_3_LUCID -lavcodec -lavformat -lavutil -lswresample -lpthread -llucidlog -L../../../OpenCV/lib -lopencv_calib3d -lopencv_core -lopencv_features2d -lopencv_highgui -lopencv_imgproc -lopencv_video/usr/bin/ld: warning: libopencv_flann.so.4.0, needed by ../../../lib64/libopencv_calib3d.so, not found (try using -rpath or -rpath-link)/usr/bin/ld: warning: libmetavision_sdk_core.so.4, needed by ../../../lib64/libgentl.so, not found (try using -rpath or -rpath-link)/usr/bin/ld: warning: libmetavision_sdk_base.so.4, needed by ../../../lib64/libgentl.so, not found (try using -rpath or -rpath-link)/usr/bin/ld: ../../../lib64/libopencv_features2d.so: undefined reference to cv::flann::IndexParams::setInt(std::__cxx11::basic_stringchar, std::char_traitschar, std::allocatorchar const, int)/usr/bin/ld: ../../../lib64/libopencv_calib3d.so: undefined reference to cv::flann::Index::~Index()/usr/bin/ld: ../../../lib64/libopencv_features2d.so: undefined reference to cv::flann::IndexParams::setFloat(std::__cxx11::basic_stringchar, std::char_traitschar, std::allocatorchar const, float)/usr/bin/ld: ../../../lib64/libopencv_calib3d.so: undefined reference to cv::flann::KDTreeIndexParams::KDTreeIndexParams(int)/usr/bin/ld: ../../../lib64/libgentl.so: undefined reference to Metavision::CDFrameGenerator::add_events(Metavision::EventCD const*, Metavision::EventCD const*)/usr/bin/ld: ../../../lib64/libgentl.so: undefined reference to Metavision::CDFrameGenerator::~CDFrameGenerator()/usr/bin/ld: ../../../lib64/libopencv_calib3d.so: undefined reference to cv::flann::Index::knnSearch(cv::_InputArray const, cv::_OutputArray const, cv::_OutputArray const, int, cv::flann::SearchParams const)/usr/bin/ld: ../../../lib64/libgentl.so: undefined reference to Metavision::RateEstimator::add_data(long long, unsigned long)/usr/bin/ld: ../../../lib64/libopencv_features2d.so: undefined reference to cv::flann::IndexParams::IndexParams()/usr/bin/ld: ../../../lib64/libgentl.so: undefined reference to Metavision::CDFrameGenerator::CDFrameGenerator(long, long, bool)/usr/bin/ld: ../../../lib64/libopencv_features2d.so: undefined reference to cv::flann::IndexParams::getAll(std::vectorstd::__cxx11::basic_stringchar, std::char_traitschar, std::allocatorchar , std::allocatorstd::__cxx11::basic_stringchar, std::char_traitschar, std::allocatorchar , std::vectorcv::flann::FlannIndexType, std::allocatorcv::flann::FlannIndexType , std::vectorstd::__cxx11::basic_stringchar, std::char_traitschar, std::allocatorchar , std::allocatorstd::__cxx11::basic_stringchar, std::char_traitschar, std::allocatorchar , std::vectordouble, std::allocatordouble ) const/usr/bin/ld: ../../../lib64/libopencv_features2d.so: undefined reference to cv::flann::IndexParams::setBool(std::__cxx11::basic_stringchar, std::char_traitschar, std::allocatorchar const, bool)/usr/bin/ld: ../../../lib64/libopencv_features2d.so: undefined reference to cv::flann::IndexParams::~IndexParams()/usr/bin/ld: ../../../lib64/libgentl.so: undefined reference to Metavision::CDFrameGenerator::start(unsigned short, std::functionvoid (long long, cv::Mat) const)/usr/bin/ld: ../../../lib64/libgentl.so: undefined reference to Metavision::RateEstimator::RateEstimator(std::functionvoid (long long, double, double) const, long long, long long, bool)/usr/bin/ld: ../../../lib64/libopencv_calib3d.so: undefined reference to cv::flann::SearchParams::SearchParams(int, float, bool)/usr/bin/ld: ../../../lib64/libopencv_features2d.so: undefined reference to cv::flann::IndexParams::setDouble(std::__cxx11::basic_stringchar, std::char_traitschar, std::allocatorchar const, double)/usr/bin/ld: ../../../lib64/libopencv_features2d.so: undefined reference to cv::flann::IndexParams::setAlgorithm(int)/usr/bin/ld: ../../../lib64/libopencv_calib3d.so: undefined reference to cv::flann::LinearIndexParams::LinearIndexParams()/usr/bin/ld: ../../../lib64/libopencv_features2d.so: undefined reference to cv::flann::IndexParams::setString(std::__cxx11::basic_stringchar, std::char_traitschar, std::allocatorchar const, std::__cxx11::basic_stringchar, std::char_traitschar, std::allocatorchar const)/usr/bin/ld: ../../../lib64/libopencv_calib3d.so: undefined reference to cv::flann::Index::Index(cv::_InputArray const, cv::flann::IndexParams const, cvflann::flann_distance_t)/usr/bin/ld: ../../../lib64/libgentl.so: undefined reference to Metavision::CDFrameGenerator::stop()/usr/bin/ld: ../../../lib64/libopencv_calib3d.so: undefined reference to cv::flann::IndexParams::~IndexParams()/usr/bin/ld: ../../../lib64/libgentl.so: undefined reference to Metavision::CDFrameGenerator::set_display_accumulation_time_us(long long)/usr/bin/ld: ../../../lib64/libgentl.so: undefined reference to Metavision::CDFrameGenerator::set_colors(cv::Scalar_double const, cv::Scalar_double const, cv::Scalar_double const, bool)collect2: error: ld returned 1 exit statusmake: *** [../common.mk:97: Cpp_Acquisition] Error 1原因分析SDK 自带 OpenCV 库和 Metavision 库存放在lib64、OpenCV/lib、Metavision/lib等非系统标准路径下。链接器通过-L选项能找到直接指定的库如-larena但对于这些库自身依赖的间接库如libopencv_flann.so链接器不会自动使用-L路径去搜索。需要使用-Wl,-rpath-link选项告知链接器间接依赖库的搜索路径。解决方案修改common.mk文件在LDFLAGS中添加-Wl,-rpath-link选项指向 SDK 提供的库目录LDFLAGS -L../../../lib64 \ -L../../../GenICam/library/lib/Linux64_x64 \ -L../../../ffmpeg \ -Wl,-rpath-link/opt/arena/ArenaSDK_Linux_x64/lib64 \ -Wl,-rpath/opt/arena/ArenaSDK_Linux_x64/lib64 \ -Wl,-rpath-link/opt/arena/ArenaSDK_Linux_x64/Metavision/lib \ -Wl,-rpath/opt/arena/ArenaSDK_Linux_x64/Metavision/lib \ -Wl,-rpath-link/opt/arena/ArenaSDK_Linux_x64/OpenCV/lib \ -Wl,-rpath/opt/arena/ArenaSDK_Linux_x64/OpenCV/lib \ -Wl,-rpath-link/opt/arena/ArenaSDK_Linux_x64/GenICam/library/lib/Linux64_x64 \ -Wl,-rpath/opt/arena/ArenaSDK_Linux_x64/GenICam/library/lib/Linux64_x64 \ -Wl,-rpath-link/opt/arena/ArenaSDK_Linux_x64/ffmpeg \ -Wl,-rpath/opt/arena/ArenaSDK_Linux_x64/ffmpeg \ $(LIB_OPENCV_SHARED)注意 看自己是什么系统我是amd64就在 这个条件下修改 ifeq ($(ARCH_TYPE), amd64)同时针对 C11 ABI 兼容性问题出现std::__cxx11::basic_string符号修改CFLAGSCFLAGS-Wall -g -O2 -stdc11 -Wno-unknown-pragmas -D_GLIBCXX_USE_CXX11_ABI0问题二运行时阶段-动态库找不到libarena.so.1 liblucidlog.so.1、libGenApi_gcc54_v3_3_LUCID.so错误现象./Cpp_Acquisition: error while loading shared libraries: libarena.so.1: cannot open shared object file: No such file or directory原因分析编译成功但运行时动态链接器只在系统默认路径/lib、/usr/lib等中查找共享库无法找到 SDK 自定义路径下的库文件。编译时添加的-rpath-link仅作用于链接阶段不写入可执行文件运行时需要-rpath或LD_LIBRARY_PATH环境变量。解决方案在common.mk文件的OUTDIR ../../../OutputDirectory/Linux/x64Release/语句后面另起一行加上# 固化运行时库搜索路径 LIBS -Wl,-rpath/opt/arena/ArenaSDK_Linux_x64/lib64 \ -Wl,-rpath/opt/arena/ArenaSDK_Linux_x64/Metavision/lib \ -Wl,-rpath/opt/arena/ArenaSDK_Linux_x64/OpenCV/lib \ -Wl,-rpath/opt/arena/ArenaSDK_Linux_x64/GenICam/library/lib/Linux64_x64 \ -Wl,-rpath/opt/arena/ArenaSDK_Linux_x64/ffmpeg最终修改汇总common.mk中amd64部分ifeq ($(ARCH_TYPE), amd64) OPENCV_ROOT_PATH ../../../OpenCV INC_OPENCV_PATH -I$(OPENCV_ROOT_PATH)/include LIB_OPENCV_SHARED -L$(OPENCV_ROOT_PATH)/lib \ -lopencv_calib3d \ -lopencv_core \ -lopencv_features2d \ -lopencv_highgui \ -lopencv_imgproc \ -lopencv_video LDFLAGS -L../../../lib64 \ -L../../../GenICam/library/lib/Linux64_x64 \ -L../../../ffmpeg \ -Wl,-rpath-link/opt/arena/ArenaSDK_Linux_x64/lib64 \ -Wl,-rpath-link/opt/arena/ArenaSDK_Linux_x64/Metavision/lib \ -Wl,-rpath-link/opt/arena/ArenaSDK_Linux_x64/OpenCV/lib \ -Wl,-rpath-link/opt/arena/ArenaSDK_Linux_x64/GenICam/library/lib/Linux64_x64 \ -Wl,-rpath-link/opt/arena/ArenaSDK_Linux_x64/ffmpeg \ $(LIB_OPENCV_SHARED) GENICAMLIBS -lGCBase_gcc54_v3_3_LUCID \ -lGenApi_gcc54_v3_3_LUCID \ -lLog_gcc54_v3_3_LUCID \ -llog4cpp_gcc54_v3_3_LUCID \ -lMathParser_gcc54_v3_3_LUCID \ -lNodeMapData_gcc54_v3_3_LUCID \ -lXmlParser_gcc54_v3_3_LUCID OUTDIR ../../../OutputDirectory/Linux/x64Release/ # 固化运行时库搜索路径 LIBS -Wl,-rpath/opt/arena/ArenaSDK_Linux_x64/lib64 \ -Wl,-rpath/opt/arena/ArenaSDK_Linux_x64/Metavision/lib \ -Wl,-rpath/opt/arena/ArenaSDK_Linux_x64/OpenCV/lib \ -Wl,-rpath/opt/arena/ArenaSDK_Linux_x64/GenICam/library/lib/Linux64_x64 \ -Wl,-rpath/opt/arena/ArenaSDK_Linux_x64/ffmpeg endif全局编译修改选项解决ABI兼容性CFLAGS-Wall -g -O2 -stdc11 -Wno-unknown-pragmas -D_GLIBCXX_USE_CXX11_ABI0重新编译运行即可。第二天重启之后发现又无法正常运行了问题描述在 Docker 容器内成功编译并运行 Arena SDK 示例程序Cpp_Acquisition后宿主机重启或重新启动容器再次运行程序时出现动态库加载失败错误text./Cpp_Acquisition: error while loading shared libraries: liblucidlog.so.1: cannot open shared object file: No such file or directory随后依次报出缺失libGenApi_gcc54_v3_3_LUCID.solibmetavision_sdk_core.so.4libmetavision_sdk_base.so.4尽管可执行文件中已通过RUNPATH固化了库搜索路径且库文件本身完整存在但运行时动态链接器仍无法找到它们。原因分析RUNPATH 被忽略系统的动态链接器在某些情况下如受SELinux、AppArmor安全策略影响或与/etc/ld.so.conf配置优先级冲突未能完全遵守可执行文件内嵌的RUNPATH设置。系统库缓存未包含 SDK 路径重启后系统级动态链接器缓存/etc/ld.so.cache被重建而 Arena SDK 的非标准库路径未在系统配置中注册导致回退到默认路径搜索时失败。容器环境变量丢失之前可能依赖LD_LIBRARY_PATH临时解决重启后环境变量失效。临时解决方案立即生效通过在容器内手动将 SDK 库路径添加到系统动态链接器配置中并刷新缓存使程序能直接从系统缓存加载库不再依赖RUNPATH或环境变量。具体操作在容器内以root执行# 1. 创建配置文件写入所有必需的库路径 tee /etc/ld.so.conf.d/arena.conf /dev/null EOF /opt/arena/ArenaSDK_Linux_x64/lib64 /opt/arena/ArenaSDK_Linux_x64/GenICam/library/lib/Linux64_x64 /opt/arena/ArenaSDK_Linux_x64/Metavision/lib /opt/arena/ArenaSDK_Linux_x64/OpenCV/lib /opt/arena/ArenaSDK_Linux_x64/ffmpeg EOF # 2. 更新系统库缓存 ldconfig # 3. 验证库已被缓存 ldconfig -p | grep -E libGenApi_gcc54|libmetavision_sdk执行后直接运行./Cpp_Acquisition程序即可正常工作。永久固化方案将修改保存为 Docker 镜像临时修改仅存在于当前容器中若容器被删除或重新创建配置会丢失。通过docker commit将当前容器提交为新镜像可使配置永久生效。操作步骤在宿主机终端执行退出容器若还在容器内exit查看容器列表获取容器名称或 IDsudo docker ps -a将当前容器提交为新镜像假设容器名为arena_envsudo docker commit arena_env arena-sdk:latest验证镜像生成sudo docker images | grep arena-sdk进入容器后直接运行 ./Cpp_Acquisition无需任何额外配置即可正常运行。

更多文章