Appel C / C ++ formulaire de code d'un programme Fortran en studio visuel? (Comment compiler mixte C et Fortran en studio visuel)
-
01-10-2019 - |
Question
Je suis à la recherche d'une certaine manière, comment je peux intégrer un code C ++ avec le code Fortran (je veux simplement appeler des fonctions C / C ++ dans le code Fortran).
J'ai trouvé quelques propositions pour les compilateurs gcc ou console, mais je ne la moindre idée comment traduire cette approche pour résoudre integrationproblem dans le studio visuel.
A l'époque, je pense à la création d'une forme dll c ++ code et appeler à partir du code Fortran.
Quelqu'un at-il déjà vu une solution? Ou ce qui est sur les frais généraux pour appeler la fonction de dll? Mes transferts de code Fortran un lot de mémoire dans la fonction C, est-il des problèmes, si je voudrais résoudre ce problème dll?
thx.
PS J'utilise Visual Studio 2008 compilateurs Prof et Intel 10
PPS Je pense, je dois préciser plus concret, ce que je veux: je veux compiler un projet Fortran en studio visuel, qui utilise certaines fonctions C.
La solution
Il y a une nouvelle façon de faire qui a de nombreux avantages - utiliser le Fortran 2003 ISO C Reliure. Ceci est une norme et donc en grande partie OS et le langage de manière indépendante de l'interface Fortran et C (et toute langue qui utilisera les conventions d'appel C). Intel Fortran 11 supports ainsi que de nombreux autres compilateurs - pas sûr de la version 10. Utilisation de la liaison ISO C, vous pouvez faire correspondre un nom de C (tout cas), n'ont pas à vous soucier des underscores (et les variations entre les compilateurs) et peut préciser les types et méthodes d'appel (par référence, par valeur) pour les arguments. Intel fournit quelques exemples dans un dossier avec leur compilateur; il y a aussi des exemples dans le manuel gfortran et une discussion de considérations supplémentaires pour Windows. Il y a des questions et des réponses précédentes ici et sur le forum Intel Fortran.
Autres conseils
I intégrée C et Fortran il y a environ 20 ans et a maintenu cette intégration jusqu'à il y a 5 ans. Les trucs que j'utilisés sont:
- Je remarque que le compilateur Fortran met tous les symboles en majuscules, alors assurez-vous que vos fonctions C / C ++ sont écrits en majuscules ainsi. Pour vérifier comment les symboles sont mis dans le fichier OBJ, utilisez DUMPBIN.
- Le compilateur Fortran ne comprend pas le nom-mutiler fait par le compilateur C ++. Compiler toutes vos fonctions C ++ en utilisant la convention de style C (en utilisant extern "C")
- Les arguments en Fortran sont toujours mis sur la pile en utilisant des références / pointeurs. Par conséquent, utiliser un pointeur-arguments dans votre fonction C.
Pour être honnête, je renonçai intégrer C et Fortran quand je suis passé à VS2005, donc les choses peuvent avoir changé depuis. Néanmoins, il est toujours une bonne idée d'utiliser DUMPBIN pour voir quel genre de symboles le compilateur Fortran produit, et d'ajuster la compilation des sources C / C ++ pour s'adapter à cela.
Nous le faisons où je travaille.
En supposant que vous utilisez le compilateur Intel Fortran, regardez ses documents. Par défaut, Intel Fortran passe tout par référence et (je crois) utilise la convention d'appel C, avec un identifiant tous les chapeaux. Les chaînes sont un problème particulier, comme Fortran aime passer la longueur comme un paramètre caché, avec un réglage du compilateur pour savoir où il va dans la liste des paramètres.
Une sage programer ne repose pas sur les valeurs par défaut (où une erreur peut conduire à un comportement non défini), et utilisera les déclarations de INTERFACE
intel pour indiquer la convention d'appel, en passant des paramètres, et le nom du lien pour la routine. Les informations sur les cette page ( Propriétés et conventions d'appel ATTRIBUTS) est un must-read. En particulier, vous avez besoin de comprendre les règles de Arcane pour quand et où seront passés les paramètres de longueur de chaîne. J'ai une impression de ce que je garde sur ma personne. : -)
Une autre chose à noter est que les versions de VisualStudio passé 6 ne le font pas comme des projets mixtes Fortran et C. Nous avons résolu le problème en créant des fichiers de projet personnalisé interpellent makefile, mais c'est un PITA. Je vous suggère d'aller avec le flux et l'utilisation de projets distincts, sauf si vous faites cela beaucoup comme nous.
Solution trouvée: lien de solution
J'ai eu plusieurs problèmes avec la liaison, ce qui pourrait être résolu par l'ajout dans les propriétés du projet.
code pour le test:
#include <stdio.h>
extern "C"
{
void f()
{
printf("hi from c\n mega test");
}
}
Fortran
PROGRAM HelloWorld
use, intrinsic :: iso_c_binding
implicit none
interface
subroutine f( ) bind( c )
use, intrinsic :: iso_c_binding
end subroutine f
end interface
call f
END PROGRAM HelloWorld
sur demande je peux télécharger le TestProject. merci tout, nous espérons qu'il était mon dernier problème avec c et Fortran
j'ai pu construire obj à partir de sources Fortran grâce aux Outils de construction faite sur commande de Visual express 2010. Je suppose qu'il est également possible dans Visual studio.
Si vous voulez mélanger C et Fortran ensemble, il y a un bon tutoriel . Il a été écrit pour les compilateurs gcc mais vous devriez être en mesure d'apprendre comment traiter avec le nom mutiler facilement.
Selon le compilateur, compilé sous-routines / fonctions sont en majuscules / minuscules, avec un underscore final, avec un trait de soulignement de premier plan, ... Pour un lien succesfull, vous pouvez utiliser dumpbin outils pour voir comment le nom apparaît dans le ObjectFile.
Une autre méthode consiste à utiliser des modules de iso_c_binding
, mais il est disponible avec Fortran 2003 seulement.
Ceci est la façon dont il fonctionne avec gcc et la console
C.C:
#include <stdio.h>
void f_()
{
printf("Hi from C\n");
}
fortran.f90
PROGRAM HelloWorld
CALL f
END PROGRAM HelloWorld
Makefile
SRCDIR=.
all: clean release run
release:
gcc -c c.c -o c.out
gfortran -c fortran.f90 -o fortran.out
gfortran -o out.exe fortran.out c.out
run:
out.exe
clean:
@$(ZSHMAGIC) rm -rf *.exe core* *.o a.out 2> /dev/null
Une autre question: ai-je ajouter toujours « _ » après le nom c-fonction, que je l'utilise dans le programme Fortran