编译OSG 3.4遇R_X86_64_32重定位错误,已加-fPIC仍失败求助
解决OpenSceneGraph 3.4编译时ffmpeg静态库重定位错误
核心原因
你遇到的R_X86_64_32重定位错误,本质是链接的ffmpeg静态库(libavformat.a等)本身没有用-fPIC参数编译。虽然你的OSG项目编译时加了-fPIC,但静态库是独立编译的产物,它的代码里没有生成位置无关代码,链接到共享模块(osgdb_ffmpeg.so)时就会触发这个错误。
具体解决步骤
1. 重新编译ffmpeg静态库,强制加入-fPIC
不管你是通过包管理器安装的ffmpeg还是自己编译的,只要是静态库版本,必须确保编译时加了-fPIC:
- 如果是手动编译ffmpeg,配置时加上以下参数:
注意:./configure --enable-static --disable-shared --extra-cflags="-fPIC" --extra-ldflags="-fPIC" make && make install--enable-static --disable-shared用于生成纯静态库,--extra-cflags和--extra-ldflags确保所有编译的代码都带位置无关属性。 - 如果是用包管理器(比如apt、yum)安装的ffmpeg静态库,大概率默认没加
-fPIC,建议卸载后手动编译符合要求的版本。
2. 确认OSG编译时正确关联新编译的ffmpeg
重新运行OSG的CMake配置,确保它找到的是你刚编译的带-fPIC的ffmpeg库:
cd your_osg_build_dir cmake .. -DFFMPEG_INCLUDE_DIR=/path/to/ffmpeg/include -DFFMPEG_LIBRARY_DIR=/path/to/ffmpeg/lib make clean && make VERBOSE=1
替换/path/to/ffmpeg/include和/path/to/ffmpeg/lib为你实际的ffmpeg安装路径。
3. 排查CMake配置是否覆盖了-fPIC
检查OSG的CMakeLists.txt或相关模块(比如FindFFmpeg.cmake),有没有意外覆盖CMAKE_C_FLAGS或CMAKE_CXX_FLAGS中的-fPIC参数。可以在CMake配置后,查看build目录下的CMakeCache.txt,确认以下变量包含-fPIC:
CMAKE_C_FLAGS:STRING=... -fPIC ... CMAKE_CXX_FLAGS:STRING=... -fPIC ...
4. 临时替代方案:改用ffmpeg共享库
如果暂时不想重新编译ffmpeg,可以修改OSG的CMake配置,让它链接ffmpeg的共享库(libavformat.so等):
cmake .. -DFFMPEG_USE_STATIC_LIBS=OFF make clean && make VERBOSE=1
这种方式跳过静态库链接,直接用共享库,能避开位置无关代码的问题,但需要系统中安装了ffmpeg共享库。
内容的提问来源于stack exchange,提问作者Corentin Salomon
相关产品推荐
相关产品推荐

