三亩地 三亩地SAN MU DI · CODE DIARY
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 pkgconfig

2. 升级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 仅支持C++11,而SeetaFace6部分模块(如TenniS)可能用到 C++14/17特性(例如std::make_uniqueconstexpr扩展等),所以安装DevToolset-9。

sudo yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++ scl enable devtoolset-9 bash # 进入新 shell

3. 安装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_LIBS=ON。

在CentOS7上源码编译OpenCV 4.5.5 是一个标准流程,但为了确保与SeetaFace6完美兼容,关键在于正确设置 CMake 参数。以下是完整的操作步骤:

第一步:在开始编译前,需要安装所有必需的依赖库和工具。

1.安装开发工具及EPEL源:

sudo yum install -y epel-release sudo yum groupinstall -y "Development Tools"

2.安装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上。

第三步:配置CMake

1.创建并进入构建目录:

mkdir build && cd build

2.执行cmake配置:

使用以下命令进行配置。注意:为了满足 SeetaFace6 对动态库的需求,-DBUILD_SHARED_LIBS=ON参数是必需的。

cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D BUILD_SHARED_LIBS=ON \ -D WITH_TBB=ON \ -D WITH_OPENMP=ON \ -D BUILD_EXAMPLES=OFF \ -D INSTALL_C_EXAMPLES=OFF \ -D BUILD_TESTS=OFF \ -D WITH_CUDA=OFF \ -D WITH_FFMPEG=OFF \ -D BUILD_opencv_python3=OFF \ -D BUILD_opencv_python2=OFF \ ..

关键参数说明

  • CMAKE_INSTALL_PREFIX: 指定安装目录,这里是/usr/local

  • BUILD_SHARED_LIBS=ON:重要,确保编译生成动态库(.so文件)。

  • WITH_TBB/WITH_OPENMP: 启用多线程并行处理库,提升性能。

  • BUILD_EXAMPLES/BUILD_TESTS: 关闭示例和测试的编译,可以显著节省时间。

  • WITH_CUDA=OFF: 如果你的机器没有 NVIDIA GPU,请保持关闭状态。

  • WITH_FFMPEG=ON: 开启视频处理支持。

第四步:配置无误后,开始编译和安装。

# -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进程(按Ctrl+C)。

  • 进入你的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.pc'
to the PKG_CONFIG_PATH environment variable
No 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.solibopencv_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/seetaface6

export INSTALL_PREFIX=/usr/local/seetaface6 mkdir -p $INSTALL_PREFIX

1.编译基础模块一:OpenRoleZoo。这是所有模块的基础工具库。

cd OpenRoleZoo mkdir build && cd build cmake.. -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \ -DCMAKE_BUILD_TYPE=Release 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

执行编译SeetaAuthorize

cd /root/seetaface6/SeetaAuthorize/build rm -rf * cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \ -DCMAKE_BUILD_TYPE=Release \ -DORZ_ROOT_DIR=$INSTALL_PREFIX \ -DENV_ARCHIVE_DIR=lib64 \ -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_DIR=lib64 export ENV_LIBRARY_DIR=lib64 cd /root/seetaface6/TenniS mkdir -p build && cd build cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \ -DCMAKE_BUILD_TYPE=Release \ -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_DIR=lib64 \ .. 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.cmake

sudo 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保存并退出

编译FaceBoxes:

cd /root/seetaface6/FaceBoxes/build rm -rf * cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \ -DCMAKE_BUILD_TYPE=Release \ -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_DIR=lib64 \ -DENV_LIBRARY_DIR=lib64 \ .. 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_TYPE=Release \ -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_DIR=lib64 \ -DENV_LIBRARY_DIR=lib64 \ .. make -j4 sudo make install # 手动复制库文件到统一位置 sudo cp ../build/lib*/lib*.so /usr/local/seetaface6/lib64/

如果执行期间报一下错误:
/usr/bin/ld: 找不到 -lORZ_staticd
collect2: 错误:ld 返回 1
make[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_TYPE=Release \ -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_DIR=lib64 \ -DENV_LIBRARY_DIR=lib64 \ .. make -j4 sudo make install

至此文章结束。

← 返回列表