Как узнать, какой компилятор использовался: g77 или gfortran

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

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

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

3 ответов


nm filename | fgrep ' __g77'

даст результаты, если g77 был использован, между тем

nm filename | fgrep '@@GFORTRAN'

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


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

nm filename | grep _g77_
nm filename | grep _gfortran_

два замечания:

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

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