如何避免依赖库符号冲突?静态链接多版本HDF5场景
解决静态链接不同版本HDF5导致的符号冲突问题
不用把C++库foo改成动态链接,有几种可行的解决思路:
给foo库的HDF5符号重命名
如果用的是GCC/binutils工具链,直接用objcopy给foo库中所有HDF5相关符号加前缀,比如把H5*开头的符号改成foo_H5*:objcopy --prefix-symbols=foo_ libfoo.a之后用修改后的库链接,主程序的HDF5符号就不会和foo里的冲突。要是用Clang/LLVM,换成
llvm-objcopy就行。
要是你能自己编译foo库,编译时直接用-fvisibility=hidden(GCC)让HDF5符号只在库内部可见,不对外导出,从根源避免符号暴露。用链接器的命名空间隔离
部分链接器支持命名空间功能,比如GCC的--namespace选项。链接时把foo库和它依赖的HDF5放进独立命名空间:gfortran -o my_fortran_exe my_fortran_code.f90 -Wl,--namespace=foo_ns -lfoo -Wl,--namespace=default这样foo里的HDF5符号只会在自己的命名空间里生效,不会干扰主程序的符号。
统一HDF5版本重新编译foo库
要是能拿到foo的源码,直接用主程序用的那个HDF5版本重新编译静态库,让两者依赖的HDF5版本完全一致,自然就不会有符号冲突了——这是最稳妥的办法,还能避免版本差异带来的其他兼容问题。部分链接后重命名符号
先把foo库和它依赖的HDF5合并成一个部分链接的目标文件,再重命名里面的HDF5符号,最后链接到主程序:ld -r libfoo.a libhdf5_foo_version.a -o foo_hdf5.o objcopy --prefix-symbols=foo_ foo_hdf5.o gfortran -o my_fortran_exe my_fortran_code.f90 foo_hdf5.o libhdf5_main_version.a
内容的提问来源于stack exchange,提问作者Striger
相关产品推荐
相关产品推荐

