2008-11-19 38 views
7

我正在編譯一個私有項目庫,它依賴於一些庫。具體來說,其中一個依賴關係是用Fortran編譯的。在某些情況下,我已經看到編譯g77的依賴關係,在其他人看來它編譯爲gfortran。然後我的項目是./configure'd連接-lg2c-lgfortran,但到目前爲止,我一直在手工完成。如何找出使用哪個編譯器:g77或gfortran

如果可能的話,我怎麼能找出來,從尋找到從屬庫(例如經由nm或其他一些實用?),所使用的編譯器是否g77(然後我會用我的鏈接選項-lg2c )或gfortran(然後我會用-lgfortran)?

在此先感謝!

回答

6
nm filename | fgrep ' __g77' 

會給結果。

1

你也許可以通過使用nm來弄清楚它,看看編譯的代碼是否使用了其中一個或者另一個的函數,但這是相當黑客行爲。你可能會根據哪個庫可用(如果沒有libg2c可用,那麼它不是g77),但如果兩者都可用,仍然存在一些不明確之處。如果你可以自己構建依賴項,那麼你可以使用你的構建過程的一部分以某種方式告訴另一部分(變量,文件等)你使用了哪一個部分。如果使用G77,同時

nm filename | fgrep '@@GFORTRAN' 

如果使用gfortran會給結果

3

您需要在nm filename的輸出中指定是否使用g77或gfortran。在大多數情況下,如果庫至少在一個位置輸入輸出,它將調用libg2c或libgfortran,並且您會注意到其中有g77gfortran的符號。所以,最好的辦法是用grep:

nm filename | grep _g77_ 
nm filename | grep _gfortran_ 

有兩點需要注意:

  1. Grepping爲@@GFORTRAN爲geocar建議是不可靠的:它只能在平臺上工作,其中庫版本支持,這包括例如Linux但不是Windows或Mac OS。
  2. 仍然有可能某些編譯代碼調用絕對不支持庫函數(如果它只是簡單的算術並且沒有輸入輸出,例如)。在這種情況下,除非使用調試選項編譯,否則不可能告訴哪個編譯器輸出它。
相關問題