vcpkg安装的ffmpeg在Linux CMake项目链接时出现-fPIC相关错误如何解决
错误原因
这个错误是Linux下共享库链接的典型问题:
- 你当前通过vcpkg安装的ffmpeg是静态库版本(
.a后缀),编译时没有携带-fPIC(位置无关代码)参数 - 你正在构建的
libjni.so是动态共享库,Linux系统要求所有链接到共享库的静态代码都必须是位置无关的,否则链接器无法完成地址重定位,就会抛出你看到的重定位错误 - Windows平台没有类似的强制要求,所以同样的配置可以正常构建
解决方案
方案1:安装动态版本ffmpeg(推荐)
vcpkg在Linux环境默认安装静态库,你可以指定安装动态库版本:
vcpkg install ffmpeg[core]:x64-linux-dynamic
安装完成后重新配置CMake项目,find_library会自动识别.so后缀的ffmpeg动态库,链接到你的libjni.so时不会出现重定位错误。如果你的项目使用vcpkg manifest模式管理依赖,只需要在配置CMake时指定-DVCPKG_TARGET_TRIPLET=x64-linux-dynamic即可自动拉取动态版本依赖。
方案2:编译带PIC的静态ffmpeg
如果你必须使用静态链接ffmpeg的方案,可以修改vcpkg配置编译带-fPIC参数的静态库:
- 找到vcpkg中ffmpeg的portfile配置文件,路径一般为
vcpkg/ports/ffmpeg/portfile.cmake - 在configure参数配置段添加额外编译参数:
set(OPTIONS "${OPTIONS} --extra-cflags=-fPIC --extra-cxxflags=-fPIC")
- 重新编译安装ffmpeg:
vcpkg remove ffmpeg:x64-linux vcpkg install ffmpeg:x64-linux
- 重新配置CMake项目构建即可。
额外检查项
如果修改后仍存在问题,检查你的CMake配置中是否开启了全局位置无关代码编译:
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
该选项会给你项目的所有构建目标自动添加-fPIC编译参数。
内容的提问来源于stack exchange,提问作者Tobi Akinyemi
相关产品推荐
相关产品推荐

