Как узнать, какой компилятор использовался: g77 или gfortran - PullRequest
7 голосов
/ 19 ноября 2008

Я собираю библиотеку для частного проекта, который зависит от количества библиотек. В частности, одна из зависимостей скомпилирована с Fortran. В некоторых случаях я видел зависимость, скомпилированную с g77, в других я видел ее скомпилированную с gfortran. Тогда мой проект ./configure 'связан с -lg2c или -lgfortran, но до сих пор я делал это вручную.

Если это возможно, как я могу узнать, просматривая зависимую библиотеку (например, nm или с помощью другой утилиты?), Был ли используемый компилятор g77 (и тогда я буду использовать -lg2c в моих ссылках) или gfortran (и тогда я буду использовать -lgfortran)?

Заранее спасибо!

Ответы [ 3 ]

6 голосов
/ 19 ноября 2008
nm filename | fgrep ' __g77'

даст результаты, если используется g77, а

nm filename | fgrep '@@GFORTRAN'

даст результаты, если использовать gfortran.

3 голосов
/ 23 июля 2009

Вам нужно выполнить grep для чего-либо, в выводе nm filename, который указывает, использовался ли g77 или gfortran. В большинстве случаев, если библиотека выполняет как минимум ввод-вывод в одном месте, она вызовет libg2c или libgfortran, и вы заметите символ с <em>g77</em> или <em>gfortran</em>. Итак, лучше всего использовать grep:

nm filename | grep _g77_
nm filename | grep _gfortran_

Две ноты:

  1. Grepping для @@GFORTRAN, как предложил Geocar, ненадежен: он будет работать только на платформах, где поддерживается версионность библиотек, включая, например, Linux, но не Windows или Mac OS.
  2. Все еще возможно, что некоторый скомпилированный код не вызывает абсолютно никакой функции библиотеки поддержки (если все, что он делает, является простой арифметикой и не имеет ввода-вывода, например). В этом случае, если он не скомпилирован с параметрами отладки, невозможно определить, какой компилятор выводит его.
1 голос
/ 19 ноября 2008

Возможно, вам удастся выяснить это с помощью nm и посмотреть, использует ли скомпилированный код функции из той или другой функции, но это довольно подло. Возможно, вам удастся выяснить это, основываясь на том, какая библиотека доступна (если нет доступной libg2c, то, к примеру, это не был g77), но тогда у вас все еще есть некоторая неопределенность, если обе доступны. Если вы можете построить зависимость самостоятельно, то можете использовать, чтобы одна часть вашего процесса сборки как-то сообщала другой части (переменная, файл и т. Д.), Какую вы использовали.

...