无法编译自定义版本Caffe:HDF5静态库链接报错求助
Caffe编译报错:relocation R_X86_64_32S问题解决思路
我帮你拆解下这个编译报错的来龙去脉,以及适配你场景的解决办法:
问题场景回顾
你在搭建自定义版本Caffe时,执行make all -j4遇到了这个错误:
ubuntu@ip-172-31-18-244:~/caffe$ make all -j4 LD -o .build_release/lib/libcaffe.so.1.0.0-rc3 /usr/bin/ld: /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5_hl.a(H5LT.o): relocation R_X86_64_32S against `.text' can not be used when making a shared object; recompile with -fPIC /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5_hl.a: error adding symbols: Bad value collect2: error: ld returned 1 exit status Makefile:555: recipe for target '.build_release/lib/libcaffe.so.1.0.0-rc3' failed make: *** [.build_release/lib/libcaffe.so.1.0.0-rc3] Error 1
你的环境是CUDA 8.0.61、cuDNN 6.21,同一仓库主分支能正常编译,且已经做了软链接、Makefile.config修改、环境变量设置这些操作。
错误核心原因
这个报错的本质是:链接器在生成Caffe的共享库(libcaffe.so)时,意外链接了静态版本的hdf5库(libhdf5_hl.a),但这个静态库没有用-fPIC编译。
-fPIC是生成「位置无关代码」的编译选项,共享库必须依赖这种代码才能在运行时被正确加载;而静态库如果没加这个选项,就会触发重定位错误。
为什么主分支没问题?大概率是你自定义分支的Makefile/Makefile.config里,hdf5库的链接逻辑变了——原本主分支会优先找动态库(.so文件),但自定义分支的配置让链接器先找到了静态库(.a文件)。
适配你场景的解决步骤
1. 强制Makefile优先链接hdf5动态库
打开你的Makefile.config,找到LIBRARIES配置段,明确添加hdf5动态库的引用(不要写静态库后缀):
LIBRARIES += hdf5_serial hdf5_serial_hl
这样链接器会自动优先查找.so格式的动态库,而不是.a静态库。
2. 修正hdf5软链接(更稳定的写法)
你之前创建的软链接指向了具体版本号,改成通用符号链接更稳妥:
sudo rm libhdf5.so libhdf5_hl.so sudo ln -s /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5_serial.so libhdf5.so sudo ln -s /usr/lib/x86_64-linux-gnu/hdf5/serial/libhdf5_serial_hl.so libhdf5_hl.so
3. 全局添加位置无关代码编译选项
如果上面的操作还没解决,可以在Makefile里的CXXFLAGS中强制加入-fPIC,确保所有编译的代码都是位置无关的:
CXXFLAGS += -fPIC
4. 清理缓存后重新编译
最后执行清理命令,彻底清除之前的编译残留,再重新编译:
make clean make all -j4
内容的提问来源于stack exchange,提问作者anaik
相关产品推荐
相关产品推荐

