正确的链接顺序与ifort和.so库

时间:2011-10-10 16:10:24

标签: linker shared-libraries intel-fortran

我有两个第三方库A.so和B.so我正在连接我的可执行文件executable.exe。 A.so包含一个由B.so解决的错误,也就是说:

    调用时,
  • A::subroutine1()可能会因浮点异常而崩溃(FP算法错误)
  • B::subroutine1()是一个固定的实现,应该始终调用而不是A::subroutine1()

A和B的正确链接顺序是什么?我现在在做的是:

ifort <....> executable.exe <...> -lA -lB

我仍然不时得到浮点异常(错误不能完全重现,因此调试非常困难)。然而,当它崩溃时,程序让我知道A :: subroutine1()是罪犯 - 所以子程序1()的错误版本由于某种原因被链接。

我会将链接顺序翻转为第一个,但有没有一个工具可以检查executable.exe以查看在运行时调用哪个版本的subroutine1()?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

  

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

否:该信息通常不会记录在可执行文件中。规则是:无论哪个共享库定义subroutine1,首先是将要使用的那个。

例如,如果您与-lC -lB -lA相关联,并且在链接时libC.so确实定义subroutine1,但稍后您重建libC.so没有重新链接可执行文件)这样做,然后subroutine1 libC.so将被调用。

但请注意,有并发症。例如,libA.so可能与-Bsymbolic相关联,这会导致subroutine1libA.so的所有来电都绑定到subroutine1内的libA.so本身。