2008-11-19 8 views
7

Je compile une bibliothèque pour un projet privé, qui dépend d'un certain nombre de bibliothèques. Plus précisément, l'une des dépendances est compilée avec Fortran. Sur certaines instances, j'ai vu la dépendance compilée avec g77, sur d'autres que j'ai vu compilé avec gfortran. Mon projet est alors ./configure 'd pour lier avec -lg2c ou -lgfortran, mais jusqu'ici je l'ai fait à la main.Comment savoir quel compilateur a été utilisé: g77 ou gfortran

S'il est possible, comment puis-je savoir, de la recherche dans la bibliothèque dépendante (par exemple nm ou une autre utilité?), Si le compilateur utilisé était g77 (et je vais utiliser -lg2c dans mes options de lien) ou gfortran (et puis je vais utiliser -lgfortran)?

Merci d'avance!

Répondre

6
nm filename | fgrep ' __g77' 

donnera des résultats si G77 a été utilisé, quant à lui

nm filename | fgrep '@@GFORTRAN' 

donnera des résultats si gfortran est utilisé.

1

Vous pourriez être en mesure de le comprendre en utilisant nm, et de voir si le code compilé utilise des fonctions de l'un ou l'autre, mais c'est un sacré problème. Vous pourriez être capable de le comprendre en fonction de la librairie disponible (s'il n'y a pas libg2c disponible, alors ce n'était pas g77, par exemple), mais vous avez encore une ambiguïté si les deux sont disponibles. Si vous pouvez créer la dépendance vous-même, vous pouvez utiliser une partie de votre processus de construction pour indiquer à une autre partie (variable, fichier, etc.) celle que vous avez utilisée.

3

Vous devez rechercher quelque chose, dans la sortie de nm filename, qui indique si g77 ou gfortran a été utilisé. Dans la plupart des cas, si la bibliothèque fait au moins une entrée-sortie à un endroit, elle appellera libg2c ou libgfortran et vous remarquerez un symbole avec g77 ou gfortran. Alors, le mieux est d'utiliser grep:

nm filename | grep _g77_ 
nm filename | grep _gfortran_ 

Deux notes:

  1. Grepping pour @@GFORTRAN comme geocar suggéré n'est pas fiable: il ne fonctionne que sur les plates-formes où est pris en charge bibliothèque versioning, qui comprend par exemple Linux mais pas Windows ou Mac OS.
  2. Il est toujours possible que certains codes compilés n'appellent absolument aucune fonction de bibliothèque de support (si tout ce qu'elle fait est une simple opération arithmétique et n'a pas d'entrée-sortie, par exemple). Dans ce cas, à moins qu'il ne soit compilé avec les options de débogage, il est impossible de dire quel compilateur l'édite.
Questions connexes