ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

/lib64/libm.so.6: version `GLIBC_2.27‘ not found (required by **/CPU/libtennis.so)

/lib64/libm.so.6: version `GLIBC_2.27‘ not found (required by **/CPU/libtennis.so) 这一份专为 ‌CentOS 7 (glibc 2.17)‌ 环境定制的 SeetaFace6 编译详细步骤:目的是要在CentOS 7 (glibc 2.17)‌中使用SeetaFace6进行人脸检测实现人脸面部头像的截取。一开始根据 https://gitee.com/crazy-of-pig/seeta-sdk-platform.git 进行了开发开发环境为windows10专业版开发环境运行正常。生产环境是CentOS 7 (glibc 2.17)‌上限之后人脸检测报错以下是错误信息seetaface6/linux/amd64/base/CPU/libtennis.so: /lib64/libm.so.6: version GLIBC_2.27 not found (required by /seetaface6/linux/amd64/base/CPU/libtennis.so)原因是seeta-sdk-platform提供的人脸检测的Linux库的编译环境高于glibc 2.27。解决方法自己在CentOS 7 (glibc 2.17)‌环境下重新编译SeetaFace6(源码https://github.com/SeetaFace6Open/index.git)。或者在网上下载CentOS 7 (glibc 2.17)‌环境下的库https://github.com/watt1010/Seetaface6JNI_cmake.git 经测试这里提供的库可用。把so库文件替换掉seeta-sdk-platform项目里的so库文件再重新编译打包seeta-sdk-platform为jar文件即可。替换目录如下在其他地方下载的so库文件是否可用可以这样验证strings /root/tmp/libtennis.so | grep GLIBC_输出这样的信息就表示能用。注如果直接替换项目目录/seetaface6/linux/amd64/base/CPU下的库文件执行人脸检测后还是报GLIBC_2.27 not found的错误是因为引用的seeta-sdk-platform.jar包中还是老so库文件把seeta-sdk-platform.jar包中的so库文件替换后即可解决。下面是自己编译SeetaFace6的so库文件的过程由于CentOS7默认的工具链GCC4.8.5, CMake2.8版本较低而SeetaFace6需要较新的C标准和CMake版本因此需要升级C标准和CMake版本以确保生成的二进制文件兼容glibc2.17。编译前准备系统依赖与工具升级1. 安装基础开发环境CentOS7默认缺少部分C编译头文件和工具需先安装基础组。sudo yum groupinstall Development Tools -y sudo yum install -y gcc-c git wget unzip pkgconfig2. 升级cmake(关键步骤)SeetaFace6要求cmake3.10而CentOS7默认为2.8。‌不要‌尝试升级系统自带的cmake而是安装独立版本并建立软链接以免破坏系统yum功能。# 下载cmake3.20.6 二进制包 (兼容glibc2.17) wget https://github.com/Kitware/CMake/releases/download/v3.20.6/cmake-3.20.6-linux-x86_64.tar.gz tar -zxvfcmake-3.20.6-linux-x86_64.tar.gz sudo mvcmake-3.20.6-linux-x86_64 /opt/cmake # 建立软链接使cmake命令指向新版本 sudo ln -sf /opt/cmake/bin/cmake/usr/local/bin/cmake sudo ln -sf /opt/cmake/bin/ctest /usr/local/bin/ctest安装完成后验证一下cmake的版本是否正确# 验证版本 cmake--version如果验证版本失败则可能是软连接创建失败可以将/opt/cmake/bin添加到 PATH永久生效。#移除之前创建的软链接避免冲突 sudo rm -f /usr/local/bin/cmake /usr/local/bin/ctest #添加到PATH echo export PATH/opt/cmake/bin:$PATH | sudo tee /etc/profile.d/cmake.sh source /etc/profile.d/cmake.sh然后再验证cmake的版本是否正确。CentOS7自带的GCC4.8.5 仅支持C11而SeetaFace6部分模块如TenniS可能用到 C14/17特性例如std::make_unique、constexpr扩展等所以安装DevToolset-9。sudo yum install -y devtoolset-9-gcc devtoolset-9-gcc-c scl enable devtoolset-9 bash # 进入新 shell3. 安装OpenCV依赖SeetaFace6强依赖OpenCV。为了兼容性建议使用yum安装EPEL源中的OpenCV-devel或者自行编译OpenCV 3.4.x/4.x。方案A快速推荐测试用sudoyuminstall -y epel-release sudoyuminstall -y opencv-devel opencv-contrib # 注意yum 安装的 OpenCV 版本可能较老(2.4或3.4)若编译报错找不到特定符号请改用方案 B。方案B稳定推荐生产用自行编译 OpenCV 4.5.5 并安装到 /usr/local确保开启 BUILD_SHARED_LIBSON。在CentOS7上源码编译OpenCV 4.5.5 是一个标准流程但为了确保与SeetaFace6完美兼容关键在于正确设置 CMake 参数。以下是完整的操作步骤第一步在开始编译前需要安装所有必需的依赖库和工具。1.安装开发工具及EPEL源sudo yum install -y epel-release sudo yum groupinstall -y Development Tools2.安装OpenCV所需的图像、视频等依赖库sudo yum install -y cmake3 gtk2-devel libpng-devel libjpeg-turbo-devel \ libtiff-devel tbb tbb-devel libdc1394-devel \ freeglut-devel mesa-libGL mesa-libGL-devel \ eigen3-devel zlib-devel jasper-devel第二步从 GitHub 下载 OpenCV 4.5.5 的源码包。# 下载源码包 wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.5.zip # 解压 unzip opencv.zip cd opencv-4.5.5注如果下载的慢可以在其他地方下载后上传到Linux上。第三步配置CMake1.创建并进入构建目录mkdir build cd build2.执行cmake配置使用以下命令进行配置。注意为了满足 SeetaFace6 对动态库的需求-DBUILD_SHARED_LIBSON参数是必需的。cmake -D CMAKE_BUILD_TYPERELEASE \ -D CMAKE_INSTALL_PREFIX/usr/local \ -D BUILD_SHARED_LIBSON \ -D WITH_TBBON \ -D WITH_OPENMPON \ -D BUILD_EXAMPLESOFF \ -D INSTALL_C_EXAMPLESOFF \ -D BUILD_TESTSOFF \ -D WITH_CUDAOFF \ -D WITH_FFMPEGOFF \ -D BUILD_opencv_python3OFF \ -D BUILD_opencv_python2OFF \ ..关键参数说明CMAKE_INSTALL_PREFIX: 指定安装目录这里是/usr/local。BUILD_SHARED_LIBSON:重要确保编译生成动态库.so文件。WITH_TBB/WITH_OPENMP: 启用多线程并行处理库提升性能。BUILD_EXAMPLES/BUILD_TESTS: 关闭示例和测试的编译可以显著节省时间。WITH_CUDAOFF: 如果你的机器没有 NVIDIA GPU请保持关闭状态。WITH_FFMPEGON: 开启视频处理支持。第四步配置无误后开始编译和安装。# -j$(nproc) 表示使用所有CPU核心进行并行编译以加快速度 make -j$(nproc)注意编译过程耗时较长根据机器性能可能需要 1-2 小时。#安装 sudo make install第五步验证与配置更新动态链接库缓存让系统能发现新安装的 OpenCV 库。sudo ldconfig #验证安装检查版本 pkg-config --modversion opencv4 #如果命令成功输出了4.5.5则说明安装成功。执行完cmake后可能会在了 IPPICV: Download: ippicv_2020_lnx_intel64_20191018_general.tgz解决办法就是手动下载这个文件。下载链接: https://pan.baidu.com/s/1cXjNpg44UNR7DO4_jGCfwA 提取码: b7hr下载后找到并替换缓存文件首先终止当前的CMake进程按CtrlC。进入你的OpenCV源码目录cd opencv-4.5.5查看隐藏文件夹ls -a你应该能看到一个叫.cache的目录。进入它cd .cache/ippicv。在这个文件夹里你会看到一个名字很长的文件类似7421de0095c7a39162ae13a6098782f9-ippicv_2020_lnx_intel64_20191018_general.tgz。这个就是因为下载失败大小为 0KB 的“占位文件”。把你手动下载的文件重命名成这个长文件的名字然后替换掉那个 0KB 的空文件。重新执行 CMake再次运行你之前的cmake命令。在执行第五步时可能报错执行检查版本pkg-config --modversion opencv4报下面错误Package opencv4 was not found in the pkg-config search path.Perhaps you should add the directory containing opencv4.pcto the PKG_CONFIG_PATH environment variableNo package opencv4 found。解决方案确认 OpenCV 是否真的安装成功检查库文件和头文件是否存在。# 检查动态库是否存在 ls -la /usr/local/lib/libopencv_*.so* 2/dev/null # 或者如果库在 lib64 下 ls -la /usr/local/lib64/libopencv_*.so* 2/dev/null # 检查核心头文件是否存在 ls -la /usr/local/include/opencv4/opencv2/core.hpp 2/dev/null预期结果库文件应该能看到一堆libopencv_core.so、libopencv_imgproc.so等头文件应该能找到/usr/local/include/opencv4/opencv2/core.hpp如果这两个检查都不存在说明 OpenCV没有成功安装需要重新执行sudo make install。如果库和头文件都存在只是缺少.pc文件那可能是 CMake 配置时某些选项未开启。全局搜索.pc文件sudo find / -name opencv4.pc 2/dev/null #如果还是找不到说明确实没有生成。解决方案手动创建opencv4.pc#创建目录如果不存在 sudo mkdir -p /usr/local/lib/pkgconfig #创建并编辑 opencv4.pc 文件 sudo vi /usr/local/lib/pkgconfig/opencv4.pc #粘贴以下内容 prefix/usr/local exec_prefix${prefix} libdir${exec_prefix}/lib #这里根据实际安装路径调整也可能是${exec_prefix}/lib64 includedir${prefix}/include/opencv4 Name: OpenCV Description: Open Source Computer Vision Library Version: 4.5.5 Libs: -L${libdir} -lopencv_core -lopencv_imgproc -lopencv_imgcodecs -lopencv_objdetect -lopencv_highgui -lopencv_video -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_dnn -lopencv_photo -lopencv_stitching -lopencv_ml -lopencv_videoio Cflags: -I${includedir} #设置 PKG_CONFIG_PATH export PKG_CONFIG_PATH/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH #验证 pkg-config --modversion opencv4到此OpenCV 4.5.5安装完成。继续编译SeetaFace6源码#克隆SeetaFace6源码 git clone --recursive https://github.com/SeetaFace6Open/index.git seetaface6 cd seetaface6注意--recursive参数会自动拉取OpenRoleZoo, TenniS, SeetaAuthorize等子模块。若网络不佳导致失败可以手动从其他地方下载后上传到Linux上。seetaface6的安装目录统一放到 /usr/local/seetaface6export INSTALL_PREFIX/usr/local/seetaface6 mkdir -p $INSTALL_PREFIX1.编译基础模块一OpenRoleZoo。这是所有模块的基础工具库。cd OpenRoleZoo mkdir build cd build cmake.. -DCMAKE_INSTALL_PREFIX$INSTALL_PREFIX \ -DCMAKE_BUILD_TYPERelease make -j4 sudo make install cd ../..2.编译基础模块二SeetaAuthorize。负责模型授权解析依赖 OpenRoleZoo。修改/seetaface6/SeetaAuthorize目录里的CMakeLists.txt文件把 set(ORZ_ROOT_DIR /usr/local/seetaface6 CACHE STRING The ORZ library) 改为 set(ORZ_ROOT_DIR /usr/local/seetaface6 CACHE STRING The ORZ library) 把 find_library(LIB_ORZ_PATH ORZ_static${ENV_SUFFIX} ${ORZ_ROOT_DIR}/${ENV_ARCHIVE_DIR}) 改为 set(LIB_ORZ_PATH ${ORZ_ROOT_DIR}/lib/libORZ_static.a)先确定libORZ_static.a文件生成到了哪个目录下。我这里在/root/seetaface6/OpenRoleZoo/lib目录下。手动复制OpenRoleZoo的库文件到安装目录# 确保目标目录存在 sudo mkdir -p $INSTALL_PREFIX/lib64 # 复制库文件 sudo cp /root/seetaface6/OpenRoleZoo/lib/libORZ_static.a $INSTALL_PREFIX/lib64/ # 复制头文件如果还没有 sudo cp -r /root/seetaface6/OpenRoleZoo/include $INSTALL_PREFIX/ # 验证libORZ_static.a文件 ls -la $INSTALL_PREFIX/lib64/libORZ_static.a执行编译SeetaAuthorizecd /root/seetaface6/SeetaAuthorize/build rm -rf * cmake -DCMAKE_INSTALL_PREFIX$INSTALL_PREFIX \ -DCMAKE_BUILD_TYPERelease \ -DORZ_ROOT_DIR$INSTALL_PREFIX \ -DENV_ARCHIVE_DIRlib64 \ -DLIB_ORZ_PATH$INSTALL_PREFIX/lib64/libORZ_static.a \ .. make -j4 sudo make install如果 $INSTALL_PREFIX/lib64目录没有libSeetaAuthorize.so文件需要查找libSeetaAuthorize.so文件在哪个目录并复制到$INSTALL_PREFIX/lib64目录里。编译TenniS# 设置环境变量让后续编译默认使用 lib64 export ENV_ARCHIVE_DIRlib64 export ENV_LIBRARY_DIRlib64 cd /root/seetaface6/TenniS mkdir -p build cd build cmake -DCMAKE_INSTALL_PREFIX$INSTALL_PREFIX \ -DCMAKE_BUILD_TYPERelease \ -DORZ_ROOT_DIR$INSTALL_PREFIX \ -DLIB_ORZ_PATH$INSTALL_PREFIX/lib64/libORZ_static.a \ -DLIB_SEETA_AUTHORIZE_PATH$INSTALL_PREFIX/lib64/libSeetaAuthorize.so \ -DENV_ARCHIVE_DIRlib64 \ .. make -j4 sudo make install # 将TenniS的库复制到 lib64 sudo cp /usr/local/seetaface6/lib/libtennis.so /usr/local/seetaface6/lib64/ #验证所有库是否就位 ls -la /usr/local/seetaface6/lib64/ | grep -E (ORZ|SeetaAuthorize|tennis) #应该能看到三个库文件libORZ_static.a libSeetaAuthorize.so libtennis.so检查/usr/local/seetaface6/cmake目录中是否存在 SeetaAuthorizeConfig.cmake 文件如果不存在要手动创建。创建 SeetaAuthorizeConfig.cmakesudo vi /usr/local/seetaface6/cmake/SeetaAuthorizeConfig.cmake #粘贴以下内容 # SeetaAuthorize Config file set(SEETA_AUTHORIZE_INCLUDE_DIRS /usr/local/seetaface6/include) set(SEETA_AUTHORIZE_LIBRARIES /usr/local/seetaface6/lib64/libSeetaAuthorize.so) # 如果是静态库用这个 # set(SEETA_AUTHORIZE_LIBRARIES /usr/local/seetaface6/lib64/libSeetaAuthorize.a) # 创建 IMPORTED 目标 add_library(SeetaAuthorize::SeetaAuthorize UNKNOWN IMPORTED) set_target_properties(SeetaAuthorize::SeetaAuthorize PROPERTIES IMPORTED_LOCATION ${SEETA_AUTHORIZE_LIBRARIES} INTERFACE_INCLUDE_DIRECTORIES ${SEETA_AUTHORIZE_INCLUDE_DIRS} ) # :wq保存并退出编译FaceBoxescd /root/seetaface6/FaceBoxes/build rm -rf * cmake -DCMAKE_INSTALL_PREFIX$INSTALL_PREFIX \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_PREFIX_PATH$INSTALL_PREFIX \ -DCMAKE_EXE_LINKER_FLAGS-L/usr/local/seetaface6/lib64 \ #如果报错找不到-lORZ_static就添加此行和下面一行来指定路径 -DCMAKE_SHARED_LINKER_FLAGS-L/usr/local/seetaface6/lib64 \ -DSeetaAuthorize_DIR$INSTALL_PREFIX/cmake \ -DLIB_ORZ_PATH$INSTALL_PREFIX/lib64/libORZ_static.a \ -DLIB_TENNIS_PATH$INSTALL_PREFIX/lib/libtennis.so \ -DLIB_SEETA_AUTHORIZE_PATH$INSTALL_PREFIX/lib64/libSeetaAuthorize.so \ -DOpenCV_DIR/usr/local/lib/cmake/opencv4 \ -DENV_ARCHIVE_DIRlib64 \ -DENV_LIBRARY_DIRlib64 \ .. make -j4 sudo make install # 复制库文件 sudo cp /root/seetaface6/build/lib/libSeetaFaceDetector600.so /usr/local/seetaface6/lib64/ # 复制头文件 sudo cp -r /root/seetaface6/build/include/seeta /usr/local/seetaface6/include/ # 验证 ls -la /usr/local/seetaface6/lib64/libSeetaFaceDetector600.so编译其他功能模块其他模块FaceRecognizer6、Landmarker、AgePredictor 等采用完全相同的流程cd /root/seetaface6/模块名 mkdir -p build cd build cmake -DCMAKE_INSTALL_PREFIX$INSTALL_PREFIX \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_PREFIX_PATH$INSTALL_PREFIX \ -DCMAKE_EXE_LINKER_FLAGS-L/usr/local/seetaface6/lib64 \ -DCMAKE_SHARED_LINKER_FLAGS-L/usr/local/seetaface6/lib64 \ -DSeetaAuthorize_DIR$INSTALL_PREFIX/cmake \ -DLIB_ORZ_PATH$INSTALL_PREFIX/lib64/libORZ_static.a \ -DLIB_TENNIS_PATH$INSTALL_PREFIX/lib/libtennis.so \ -DLIB_SEETA_AUTHORIZE_PATH$INSTALL_PREFIX/lib64/libSeetaAuthorize.so \ -DOpenCV_DIR/usr/local/lib/cmake/opencv4 \ -DENV_ARCHIVE_DIRlib64 \ -DENV_LIBRARY_DIRlib64 \ .. make -j4 sudo make install # 手动复制库文件到统一位置 sudo cp ../build/lib*/lib*.so /usr/local/seetaface6/lib64/如果执行期间报一下错误/usr/bin/ld: 找不到 -lORZ_staticdcollect2: 错误ld 返回 1make[2]: *** [lib64/libSeetaFaceAntiSpoofingX600d.so] 错误 1问题出在Debug模式编译时链接器在找libORZ_staticd.a带d后缀的Debug版本但您只有Release版本的 libORZ_static.a。解决方案直接创建一个 Debug 版本的库软链接cd /usr/local/seetaface6/lib64 sudo ln -sf libORZ_static.a libORZ_staticd.a然后直接编译不需要重新 cmake。下面举例编译FaceRecognizer6库文件其他功能模块都是这样编译cd /root/seetaface6/FaceRecognizer6 mkdir -p build cd build cmake -DCMAKE_INSTALL_PREFIX$INSTALL_PREFIX \ -DCMAKE_BUILD_TYPERelease \ -DCMAKE_PREFIX_PATH$INSTALL_PREFIX \ -DCMAKE_EXE_LINKER_FLAGS-L/usr/local/seetaface6/lib64 \ -DCMAKE_SHARED_LINKER_FLAGS-L/usr/local/seetaface6/lib64 \ -DSeetaAuthorize_DIR$INSTALL_PREFIX/cmake \ -DLIB_ORZ_PATH$INSTALL_PREFIX/lib64/libORZ_static.a \ -DLIB_TENNIS_PATH$INSTALL_PREFIX/lib/libtennis.so \ -DLIB_SEETA_AUTHORIZE_PATH$INSTALL_PREFIX/lib64/libSeetaAuthorize.so \ -DOpenCV_DIR/usr/local/lib/cmake/opencv4 \ -DENV_ARCHIVE_DIRlib64 \ -DENV_LIBRARY_DIRlib64 \ .. make -j4 sudo make install至此文章结束。
返回列表