2012-08-14 2 views
5

Dans le contexte d'une application mixte C/Fortran, existe-t-il un moyen de vérifier que le compilateur connaît "iso_c_binding" (par exemple, GCC 4.1.2 ne le connaît pas, 4.3.4), comme une directive de prétraitement ou quelque chose? Je ne peux pas me permettre de simplement vérifier la version de GCC puisque je peux utiliser d'autres compilateurs.Vérifier que iso_c_binding est disponible au moment de la compilation

Merci

+0

Vérifiez si '#ifdef iso_c_binding' etc ... –

+3

fonctionne Compile un programme simple qui utilise les choses dont vous avez besoin de' ISO_C_BINDING'. S'il est compilé et exécuté, vous pouvez ajouter une définition de symbole de préprocesseur à un fichier d'en-tête de configuration. Faites cette partie de votre procédure de construction de code. C'est ainsi que GNU 'autoconf' le fait dans les scripts' configure'. –

+0

Est-il possible de faire quelque chose comme ça avec CMake? – sunmat

Répondre

2

Vos seulement deux options, que je peux penser, sont à rouler votre propre version de iso_c_binding pour les systèmes qui ne disposent pas de ce module (as suggested by @HighPerformanceMark) ou d'utiliser préprocesseurs pour compiler conditionnellement parties de votre code en fonction de la version du compilateur. Dans les deux cas, vous devrez travailler pour vous assurer que votre code est portable sur tous les systèmes. Comme suggéré par @HighPerformanceMark, vous pouvez copier et coller une implémentation open-source de iso_c_binding, mais pour chaque nouveau système, vous devez vous assurer que cette implémentation est correcte.

Selon la façon dont vous voulez que votre code se comporter si iso_c_binding est pas avaiable Je recommanderais d'utiliser la méthode de préprocesseur. Vous déclarez que "je ne peux pas me permettre de vérifier simplement la version de GCC puisque je peux utiliser d'autres compilateurs". Cependant, toutes vos options nécessiteront un travail de votre part pour maintenir votre code pour une utilisation sur différents systèmes, la méthode du préprocesseur nécessite, dans mon opionion, la moindre quantité de travail.

Le code suivant détermine la version du compilateur à l'aide du préprocesseur et peut être utilisé pour compiler le code de manière conditionnelle en fonction de la version minimale du compilateur. Pour gfortran:

Si GNU Fortran invoque le préprocesseur, __GFORTRAN__ est défini et __GNUC__, __GNUC_MINOR__ et __GNUC_PATCHLEVEL__ peut être utilisé pour déterminer la version du compilateur.

Dans un fichier, disons precomp.inc J'inclurais un certain nombre de vérifications de précompilateurs qui déterminent les fonctions à inclure dans votre code. Par exemple, je voudrais vérifier la version du compilateur et, si elle prend en charge l'utilisation du module iso_c_binding je définirais une macro de préprocesseur HAS_ISO_C_BINDING (ou similaire). Le fichier precomp.inc peut ensuite être inclus dans d'autres parties de votre code. Ce fichier pourrait ressembler à:

!> \file precomp.inc 
!! Preprocessor feature detection. 

#if defined(__GFORTRAN__) 

#if __GNUC__ >= 4 && __GNUC_MINOR__ >= 3 
#define HAS_ISO_C_BINDING 1 
#else 
#define HAS_ISO_C_BINDING 0 
#endif 

#elif defined(__INTEL_COMPILER) 
#error "I haven't implemented this yet..." 

#else 
#error "Compiler not yet supported." 

#endif 

L'erreur dans la clause #else finale pourrait être remplacé par HAS_ISO_C_BINDING=0, si vous voulez être en mesure de compiler sans support pour le module iso_c_binding.

Votre source de Fortran ressemblerait à quelque chose comme

program main 

#include 'precomp.h' 
#if HAS_ISO_C_BINDING 
use iso_c_binding 
#endif 

implicit none 

! Some code... 

#if HAS_ISO_C_BINDING 
! Code which depends on iso_c_binding 
#else 
! Fallback code 
#end if 

! Some more code... 

end program main 

Encore une fois, la bonne méthode à utiliser dépend de la façon dont vous voulez coder pour compiler si iso_c_binding n'est pas avaiable. Si votre code doit être compilé sur des systèmes sans ce module, la réponse de @ HighPerformanceMark est probablement meilleure. Si vous pouvez simplement déclencher une erreur lors de la compilation ou si vous avez un code de repli si iso_c_binding n'est pas disponible alors j'utiliserais cette méthode de préprocesseur car cela ne nécessite qu'une vérification supplémentaire pour chaque nouveau compilateur que vous devez utiliser.

+0

Whoa there matey. N'avoir PAS suggéré de copier les sources Intel Fortran pour 'iso_c_binding' car cela pourrait être une violation de l'IPR d'Intel, qui peut être illégal ou contre les termes d'un contrat que mes employeurs ont avec Intel pour la fourniture de logiciels. une implémentation open-source du module J'ai édité votre question pour supprimer votre assertion calomnieuse –

+0

Assez juste - apologie s pour ça. – Chris

0

La question est dirigée. Pratiquement ce que vous demandez est si le processeur Fortran compagnon (en supposant qu'il existe) prend en charge les aspects nécessaires de l'interopérabilité C que votre programme C l'exige.L'interopérabilité C est bien plus que la simple présence d'un module intrinsèque. Par exemple, il est tout à fait légitime qu'un processeur F2003 fournisse un ISO_C_BINDING qui dit alors que presque tous les aspects de l'interopérabilité C ne sont pas supportés (des constantes comme C_FLOAT, C_REAL, etc., pourraient avoir une valeur négative, signifiant "non prise en charge").

Ainsi, à moins que votre utilisation de l'interopérabilité C est incroyablement basique (il y a certains aspects qui doivent être pris en charge par un processeur F2003 - comme C_INT, C_LOC, C_F_POINTER, etc.) les seuls moyens pratiques pour déterminer la capacité sont:

  • Pour compiler un petit programme Fortran qui utilise explicitement les entités requises et teste leurs valeurs (différents nombres négatifs expliquent pourquoi le processeur Fortran ne fournit pas de support). Comme d'autres l'ont écrit, le succès ou l'échec de la compilation, et peut-être la sortie ultérieure du programme si la compilation a réussi, peuvent alors être utilisés pour configurer d'autres aspects de votre build.

  • Pour lire le manuel du processeur Fortran.

Questions connexes