我有两个第三方库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()?
谢谢!
答案 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
相关联,这会导致subroutine1
内libA.so
的所有来电都绑定到subroutine1
内的libA.so
本身。