2010-11-12 29 views
0

J'ai installé gcc et gfortran sous AIX, et ils fonctionnent correctement. Entre autres choses, je les utilise avec certaines bibliothèques auxquelles on accède par des fichiers d'en-tête (.h en C). Les mêmes bibliothèques peuvent être utilisées avec des modules (.mod Fortran), mais comme vous le savez leur utilisation est facultative: si je commente leCréer un fichier mod à partir de l'en-tête c

use mylib 
implicit none 

de mon code source Fortran, tout fonctionne bien. Le problème est, je ne veux pas commenter la implicit none, donc je dois garder le use mylib aussi, sinon je vais un tas de

Error: Symbol 'foo' at (1) has no IMPLICIT type 

erreurs. Et, comme vous le savez, les fichiers .mod dépendent compilateur, donc je ne peux pas utiliser ceux que j'ai, sinon gfortran cracheront:

Fatal Error: File 'mylib.mod' opened at (1) is not a GFORTRAN module file 

Théoriquement je pourrais recompiler toutes les bibliothèques avec gfortran, mais plus il est probable échouer pour diverses raisons (et si ce n'est pas le cas, ce sera encore une tâche décourageante).

Je me demande donc s'il existe un moyen de précompiler l'en-tête .h dans un module .mod, en fournissant uniquement les informations d'interface qui sont nécessaires. Malheureusement, je n'ai pas pu trouver d'informations à ce sujet.

+0

Savez-vous si les bibliothèques sont écrites en C ou fortran? Vous pouvez peut-être résoudre ce problème en inspectant les fichiers d'en-tête C. Je suppose que les bibliothèques seraient écrites en C, parce que les bibliothèques fortran ont tendance à ne pas être compatibles entre les différents fournisseurs, et vous laissez entendre que votre code lie sans problème. – DaveP

Répondre

2

Les fichiers d'en-tête C ne produisent pas les fichiers du module Fortran. Les fichiers du module Fortran dépendent du compilateur mais sont normalement produits lorsque vous compilez des fichiers Fortran contenant des modules. Ils enregistrent des informations sur un module de code source, telles que les procédures qu'il contient et leurs conventions d'appel, à utiliser par le compilateur lorsqu'il rencontre des appels à ces procédures. C'est la méthode par laquelle le compilateur rend les appels aux routines de module automatiquement explicites. Généralement, vous devez compiler le fichier de code source Fortran contenant le module (ici le module "mylib") avant de compiler un fichier qui a un programme principal ou une procédure qui l'utilise. Pourquoi supposez-vous que la compilation des bibliothèques avec gfortran échouera probablement ou sera décourageante? Je suggère de l'essayer. Vous ne pouvez pas compiler un fichier C .h dans un module. Si l'auteur d'une bibliothèque Fortran le voulait, ils pourraient fournir un fichier avec des interfaces Fortran décrivant les procédures et pouvant être compilées dans un module. Mais cette technique est sujette aux erreurs, car cela signifie qu'il y a deux points à garder en accord.

Si les bibliothèques sont en C et sont appelées depuis Fortran via la liaison ISO C, la meilleure technique consiste à écrire un fichier avec des interfaces. Un tel fichier Fortran a-t-il été fourni? D'où venaient les fichiers de module incorrects? Lorsque vous compilez ce fichier avec gfortran, vous obtiendrez le fichier .mod. Alors que la duplication entre le code source réel C et les déclarations d'interface Fortran signifie que deux éléments doivent être conservés, dans ce cas, il est nécessaire puisque le code source original est en C et les instructions d'interface Fortran décrivent les routines C au compilateur Fortran dans Fortran.

+0

Les bibliothèques en question sont très volumineuses et spécifiques à XL (non GNU). Si vous avez déjà essayé de compiler quelque chose conçu pour le compilateur XL d'IBM avec GNU (ou vice versa), vous saurez pourquoi je suppose que c'est décourageant ou impossible. Je ne suis même pas sûr que je peux accéder au code source pertinent .... – Davide

1

Vous pouvez déclarer les fonctions/sous-routines que vous utilisez du module comme external dans un fichier sur mesure mylib.fh, par exemple:

#mylib.fh 
external my_function 

Dans votre code Fortran, vous utiliserez alors:

implicit none 
include 'mylib.fh' 
+0

Oui, c'est une bonne suggestion. Cependant, je pourrais reformuler la question dans "comment puis-je créer automatiquement un tel mylib.fh à partir du mylib.h existant - sans écrire mon propre analyseur (que je pourrais écrire)?" – Davide

+0

Hmm, je ne connais pas de telle manière. Si vous appelez les fonctions C en tant que sous-routines dans fortran, vous n'avez besoin d'aucun en-tête, donc je suppose que vous appelez les fonctions de fortran comme des fonctions? Pourriez-vous donner un exemple avec: (i) la déclaration de la fonction dans l'en-tête C, (ii) l'appel correspondant dans votre programme fortran. Si la bibliothèque C n'était pas destinée à être appelée par fortran, vous devrez peut-être réécrire l'interface, par exemple. avec Fortran 77 cela ne fonctionnerait pas toujours. – steabert