我的代码是在Linux SLES 12上使用英特尔版本2020.4.304编译的。随着时间的推移,各种其他版本已经添加,我切换到默认的OneAPI版本2021.1.1。在Windows上,当我更新MSVS时,我需要更新安装在任何客户端系统上的C++可再发行软件。
我可以使用module
在加载的版本之间切换。当我对我的可执行文件运行ldd
时,我看到所有的依赖关系都在加载的编译器中得到了满足。运行应用程序会得到相同的输出。这似乎是一个未定义的行为,只是碰巧对我有利。以下是ldd(2020)的输出:
linux-vdso.so.1 (0x00007ffc17b9a000)
libifport.so.5 => /ots/sw/INTEL/2020.4/compilers_and_libraries_2020.4.304/linux/compiler/lib/intel64_lin/libifport.so.5 (0x0000150982a82000)
libifcoremt.so.5 => /ots/sw/INTEL/2020.4/compilers_and_libraries_2020.4.304/linux/compiler/lib/intel64_lin/libifcoremt.so.5 (0x0000150982d3a000)
libimf.so => /ots/sw/INTEL/2020.4/compilers_and_libraries_2020.4.304/linux/compiler/lib/intel64_lin/libimf.so (0x00001509823ff000)
libsvml.so => /ots/sw/INTEL/2020.4/compilers_and_libraries_2020.4.304/linux/compiler/lib/intel64_lin/libsvml.so (0x00001509808b5000)
libm.so.6 => /lib64/libm.so.6 (0x000015098056a000)
libintlc.so.5 => /ots/sw/INTEL/2020.4/compilers_and_libraries_2020.4.304/linux/compiler/lib/intel64_lin/libintlc.so.5 (0x00001509802f2000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00001509800cf000)
libdl.so.2 => /lib64/libdl.so.2 (0x000015097fecb000)
libc.so.6 => /lib64/libc.so.6 (0x000015097fad6000)
libgcc_s.so.1 => /ots/sw/GCC/10.2.0/lib64/libgcc_s.so.1 (0x000015097f8be000)
/lib64/ld-linux-x86-64.so.2 (0x0000150982cb0000)
以及OneAPI 2021:
linux-vdso.so.1 (0x00007ffd4f2a7000)
libifport.so.5 => /ots/sw/INTEL/oneapi/2021.1/compiler/2021.1.1/linux/compiler/lib/intel64_lin/libifport.so.5 (0x00001529c1c4c000)
libifcoremt.so.5 => /ots/sw/INTEL/oneapi/2021.1/compiler/2021.1.1/linux/compiler/lib/intel64_lin/libifcoremt.so.5 (0x00001529c1f02000)
libimf.so => /ots/sw/INTEL/oneapi/2021.1/compiler/2021.1.1/linux/compiler/lib/intel64_lin/libimf.so (0x00001529c15c4000)
libsvml.so => /ots/sw/INTEL/oneapi/2021.1/compiler/2021.1.1/linux/compiler/lib/intel64_lin/libsvml.so (0x00001529bfa4b000)
libm.so.6 => /lib64/libm.so.6 (0x00001529bf700000)
libintlc.so.5 => /ots/sw/INTEL/oneapi/2021.1/compiler/2021.1.1/linux/compiler/lib/intel64_lin/libintlc.so.5 (0x00001529bf488000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00001529bf265000)
libdl.so.2 => /lib64/libdl.so.2 (0x00001529bf061000)
libc.so.6 => /lib64/libc.so.6 (0x00001529bec6c000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00001529bea53000)
/lib64/ld-linux-x86-64.so.2 (0x00001529c1e7a000)
一般来说,Linux库在编译器版本之间向后兼容吗?不同的答案和评论有些矛盾。Question 1和Question 2
1条答案
按热度按时间cuxqih211#
在Linux中,库的版本是通过soname来区分的。如果Intel的可再分发库也是如此,那么它们应该没有什么不同。如果做出了破坏兼容性的更改,那么版本号就会增加,以便区分不同的版本。
因此,libifport.so.5与libifport.so.4不兼容,但如果程序需要libifport.so.5,则它应该满足于来自提供它的任何编译器版本的libifport.so.5。
打破向后可比性的变化只出现在某些编译器版本中,当然不是每年都有。由于英特尔推出了新的LLVM编译器,而旧的编译器正在成为传统,这样的变化可能会在
ifort
上完全停止,但这只是我的猜测。同样,这样的改变也会发生在一个特定的库或一组特定的库上,它们的soname编号会增加。并不是所有编译器集合附带的可再发行库都会受到影响。