Linker 使用ifort和.so库更正链接顺序

Linker 使用ifort和.so库更正链接顺序,linker,shared-libraries,intel-fortran,Linker,Shared Libraries,Intel Fortran,我有两个第三方库A.so和B.so,因此我将与我的可执行文件.exe链接在一起。A.so包含一个由B.so解决的bug,即: A::subroutine1()调用时可能会因浮点异常而崩溃(FP算术错误) B::subroutine1()是一个固定的实现,应该始终调用它,而不是a::subroutine1() A和B的正确链接顺序是什么?我现在做的是: ifort <....> executable.exe <...> -lA -lB ifort executable

我有两个第三方库A.so和B.so,因此我将与我的可执行文件.exe链接在一起。A.so包含一个由B.so解决的bug,即:

  • A::subroutine1()
    调用时可能会因浮点异常而崩溃(FP算术错误)
  • B::subroutine1()
    是一个固定的实现,应该始终调用它,而不是
    a::subroutine1()
A和B的正确链接顺序是什么?我现在做的是:

ifort <....> executable.exe <...> -lA -lB
ifort executable.exe-lA-lB
我仍然时不时地遇到浮点异常(错误无法准确再现,因此调试非常困难)。然而,当它崩溃时,程序让我知道A::subroutine1()是违规者——因此出于某种原因,错误版本的subroutine1()被链接进来

作为第一步,我将翻转链接顺序,但是是否有一个工具可以用来检查executable.exe,以查看在运行时将调用哪个版本的子程序1()


谢谢

如果希望调用
libB.so
中的
子例程1
,则正确的链接顺序为
-lB-lA
(适用于Linux和大多数其他UNIX共享库实现)

是否有一个工具可以用来检查executable.exe,以查看在运行时将调用哪个版本的子程序1()

否:该信息通常不会记录在可执行文件中。规则是:首先定义
子例程1
的共享库就是要使用的库

例如,如果您链接到
-lC-lB-lA
,并且在链接时
libC.so
没有定义
subroutine1
,但是稍后您重新构建
libC.so
(不重新链接可执行文件),那么
libC.so中的
子例程1
将被调用

然而,请注意,也存在一些复杂情况。例如,
libA.so
可能与
-Bsymbolic
链接,这将导致从
libA.so
内部对
子例程1
的所有调用绑定到
libA.so
内部的
子例程1