libavcodec.a relocation R_X86_64_PC32

编译静态ffmpeg 后再应用到自编译动态库中会出现如下错误:

/usr/bin/ld: //usr/local/lib/libavcodec.a(hevc_cabac.o): relocation R_X86_64_PC32 against symbol `ff_h264_cabac_tables' can not be used when making a shared object; recompile with -fPIC

/usr/bin/ld: //usr/local/lib/libavcodec.a(cavsdsp.o): relocation R_X86_64_PC32 against symbol `ff_pw_5' can not be used when making a shared object; recompile with -fPIC

/usr/bin/ld: //usr/local/lib/libavcodec.a(h264_cabac.o): relocation R_X86_64_PC32 against symbol `ff_h264_cabac_tables' can not be used when making a shared object; recompile with -fPIC

/usr/bin/ld: //usr/local/lib/libswscale.a(swscale.o): relocation R_X86_64_PC32 against symbol `ff_M24A' can not be used when making a shared object; recompile with -fPIC

/usr/bin/ld: //usr/local/lib/libswscale.a(rgb2rgb.o): relocation R_X86_64_PC32 against symbol `ff_w1111' can not be used when making a shared object; recompile with -fPIC

查找到的都是在编译 ffmpeg 的时候 需要在./configure --enable-pic  --extra-cflags="-fPIC " ,但是添加后依旧会出现这些链接错误,

解决方法:

如果是qt 的工程,需要在.pro 中加入  QMAKE_LFLAGS += "-Wl,-Bsymbolic"

或者可以在cmakelist 文件中加入 set(CMAKE_SHARED_LINKER_FLAGS "-Wl, -Bsymbolic")

重新编译即可

### 下载并使用特定版本的 IPPICV 文件 为了在 Linux 上为 OpenCV 使用指定版本的 `ippicv` 文件(如 `ippicv_2022.0.0_lnx_intel64_20240904_general.tgz`),可以按照以下方法操作: #### 1. 手动下载 IPPICV 文件 手动获取所需的 IPPICV 压缩包文件。可以通过官方渠道或其他可信资源下载目标文件 `ippicv_2022.0.0_lnx_intel64_20240904_general.tgz`。 如果无法找到直接链接,可以从类似的开源项目或社区中查找对应的离线镜像地址[^3]。 --- #### 2. 修改 OpenCV 的配置文件 编辑 OpenCV 源码中的 `ippicv.cmake` 配置文件,禁用自动下载功能并将路径指向本地已下载的 IPPICV 文件。 具体步骤如下: - 进入 OpenCV 源码目录下的 `3rdparty/ippicv` 路径。 - 使用文本编辑器打开 `ippicv.cmake` 文件: ```bash gedit ~/opencv_source/opencv/3rdparty/ippicv/ippicv.cmake ``` - 替换默认的在线下载逻辑为本地路径设置。修改后的关键代码片段应类似于以下内容: ```cmake set(OPENCV_ICV_NAME "ippicv_2022.0.0_lnx_intel64_20240904_general.tgz") set(OPENCV_ICV_HASH "your_file_hash_here") # 设置本地路径作为 IPPICV 的源 set(IPPICV_LOCAL_PATH "/path/to/downloaded/ippicv_2022.0.0_lnx_intel64_20240904_general.tgz") if(EXISTS "${IPPICV_LOCAL_PATH}") message(STATUS "Using local IPPICV file: ${IPPICV_LOCAL_PATH}") configure_file("${IPPICV_LOCAL_PATH}" "${THE_ROOT}/${OPENCV_ICV_NAME}" COPYONLY) else() message(FATAL_ERROR "Local IPPICV file not found at: ${IPPICV_LOCAL_PATH}. Please download it manually.") endif() ``` 上述代码通过检测是否存在本地 IPPICV 文件来决定是否继续编译过程[^4]。 --- #### 3. 准备构建环境 确保已经准备好 OpenCV 和其他依赖项的源码以及必要的工具链。例如,在 Ubuntu 系统上安装基础依赖项: ```bash sudo apt update && sudo apt install build-essential cmake git pkg-config libgtk-3-dev \ libavcodec-dev libavformat-dev libswscale-dev libjpeg-dev libpng-dev libtiff-dev \ gfortran openexr libatlas-base-dev python3-dev python3-numpy libdc1394-22-dev ``` 将下载好的 IPPICV 文件放置到指定位置 `/path/to/downloaded/ippicv_2022.0.0_lnx_intel64_20240904_general.tgz` 并验证其完整性。 --- #### 4. 编译 OpenCV 创建一个新的构建目录并运行 CMake 来生成 Makefile 或 Ninja 构建脚本: ```bash mkdir -p ~/opencv_build && cd ~/opencv_build cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \ -D WITH_CUDA=ON \ -D ENABLE_PRECOMPILED_HEADERS=OFF \ ../opencv/ ``` 完成配置后执行实际编译命令: ```bash make -j$(nproc) sudo make install ``` 此过程中会跳过 IPPICV 自动下载阶段而改用预定义的本地文件[^2]。 --- ### 注意事项 - 如果遇到哈希校验错误,请确认所使用的 IPPICV 文件与其预期的 SHA256 校验值匹配。 - 对于不同版本的 OpenCV 及 IPPICV 组件组合,可能需要调整兼容性参数以满足需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值