linux 依赖关系对于给定的编译器是向后兼容的吗?或者这会导致某种未定义的行为吗?

5n0oy7gb  于 2023-02-15  发布在  Linux
关注(0)|答案(1)|浏览(99)

我的代码是在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 1Question 2

cuxqih21

cuxqih211#

在Linux中,库的版本是通过soname来区分的。如果Intel的可再分发库也是如此,那么它们应该没有什么不同。如果做出了破坏兼容性的更改,那么版本号就会增加,以便区分不同的版本。
因此,libifport.so.5与libifport.so.4不兼容,但如果程序需要libifport.so.5,则它应该满足于来自提供它的任何编译器版本的libifport.so.5。
打破向后可比性的变化只出现在某些编译器版本中,当然不是每年都有。由于英特尔推出了新的LLVM编译器,而旧的编译器正在成为传统,这样的变化可能会在ifort上完全停止,但这只是我的猜测。
同样,这样的改变也会发生在一个特定的库或一组特定的库上,它们的soname编号会增加。并不是所有编译器集合附带的可再发行库都会受到影响。

相关问题