Appel C / C ++ formulaire de code d'un programme Fortran en studio visuel? (Comment compiler mixte C et Fortran en studio visuel)

StackOverflow https://stackoverflow.com/questions/3135296

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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top