2011-10-10 35 views
3

我有兩個第三方庫A.so和B.so,我用我的可執行文件executable.exe連接在一起。 A.so包含由B.so解決的錯誤,那就是,說:正確的鏈接順序與ifort和.so庫

  • A::subroutine1()可以用浮​​點異常崩潰稱爲(FP算術錯誤)時
  • B::subroutine1()是一個固定的實現,應總是被調用而不是A::subroutine1()

A和B的正確鏈接順序是什麼?我現在正在做的是:

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

我仍然得到了浮點異常,不時(誤差不重複性準確,所以這是非常難以調試)。但是,當它崩潰時,程序讓我知道A :: subroutine1()是罪犯 - 因此出於某種原因,錯誤版本的subroutine1()被鏈接。

我會翻轉鏈接順序作爲第一刺,但有沒有一個工具,我可以用來檢查executable.exe來查看哪些版本的subroutine1()將在運行時調用?

謝謝!

回答

1

如果你想從libB.sosubroutine1被調用,那麼正確的鏈接順序是-lB -lA(用於Linux和其他大多數UNIX共享庫的實現)。

是有一個工具,我可以用它來檢查executable.exe看什麼subroutine1的版本()將在運行時

叫號:該信息通常不記錄在可執行文件。規則是:無論哪個共享庫定義subroutine1首先是將要使用的那個。

例如,如果您有-lC -lB -lA鏈接,並在鏈接時libC.so定義subroutine1,但後來你重建libC.so沒有重新鏈接的可執行文件),因此它的話,那麼subroutine1libC.so將被調用。

但是請注意,有併發症。例如,libA.so可能與-Bsymbolic連接,這將導致從libA.sosubroutine1的所有呼叫在libA.so本身內綁定到subroutine1