2016-02-29 1 views
1

J'ai une dépendance cyclique inter-langage (C++ < -> FORTRAN) qui serait trop difficile à éradiquer, donc je vis avec. Il ne nécessite qu'une dépendance/FORCE sans dépendance de lien sur ma bibliothèque C++. Je l'ai fait manuellement comme requis, mais la nouvelle version de notre produit a huit configurations (et peut-être plus à l'avenir) et cela devient de plus en plus pénible.Visual-Studio: gérer efficacement la dépendance de la bibliothèque cyclique

Je pourrais créer des configurations 'Forced' pour chaque build dans le gestionnaire de configuration de Visual Studio, ou des copies 'Forced' de mes projets. Cependant, ces deux approches sont un peu un casse-tête de maintenance - les modifications du projet doivent être étendues à toutes les configurations/copies de projet. Quelqu'un peut-il penser à une méthode pour construire rapidement mes configurations «forcées» sans avoir à retourner les paramètres ou à maintenir une configuration synchronisée juste à cet effet?

+3

Downvoters et fermeteurs - il n'y a rien de mal à la question, et c'est clair. Que vous ne le compreniez pas, cela ne veut pas dire que ce n'est pas clair. – SergeyA

+2

Quel compilateur Fortran? Quel est votre arrangement de projet spécifique? Je ne comprends pas comment une dépendance cyclique intervient - typiquement la source de chaque langage est compilée à une ou plusieurs bibliothèques statiques, et l'éditeur de liens consomme simplement ces bibliothèques. – IanH

+0

Mon principal 'produit' est une DLL C++ qui lie un fichier statique FORTRAN lib. J'utilise le compilateur Intel Fortran et la dépendance cyclique est simplement parce que le C++ appelle le FORTRAN et le FORTRAN appelle le C++. – Kyudos

Répondre

1

Comme mentionné dans les commentaires, si les DLL sont étroitement couplés, il peut être plus logique de les combiner en une seule DLL. Cependant, si deux DLL sont toujours nécessaires, une solution consiste à diviser l'un des projets qui construit actuellement une DLL en deux - un projet de bibliothèque statique qui construit également une bibliothèque d'importation et un fichier d'exportation à partir d'un module fichier de définition, et un deuxième projet qui construit la DLL.

Ces deux projets se terminent par la construction de l'autre DLL.

Par exemple, le choix de diviser la DLL Fortran, comme je suis plus familier avec son système de projet:

  • Créer un fichier de définition de module, avec le même nom de base que sera utilisée pour la Fortran DLL , qui liste dans sa section exports tous les symboles que la DLL Fortran va exporter.

  • Créez un projet de bibliothèque statique Fortran avec un nom différent de celui de la DLL Fortran finale, configuré pour compiler toutes les sources Fortran. Dans les propriétés du projet, en tant qu'étape de construction personnalisée, ajoutez un appel supplémentaire du bibliothécaire le long des lignes lib /DEF:xxx.def /OUT:xxx.dll /MACHINE:x86 (où xxx est le nom de base qui sera utilisé pour la DLL Fortran - préfixez les noms de configuration en tant que suffixes de chemin, variez la machine option appropriée). Construire ce projet de bibliothèque statique Fortran va maintenant générer deux bibliothèques - une avec le code objet (nommé d'après le projet) et l'autre qui est la bibliothèque d'importation (nommée après la DLL) et un fichier d'exportation (également nommé d'après la DLL).

[Notez que cette approche de la bibliothèque d'importation ne dépend pas réellement sur le code objet généré lorsque les fichiers source Fortran sont compilés - utilisation de l'étape de construction personnalisée du projet de bibliothèque statique est juste une commodité. Si vous ne disposez pas déjà d'un fichier de définition de module pour la DLL Fortran, une approche alternative consiste à fournir les fichiers objet individuels dans l'appel du bibliothécaire dans l'étape de génération personnalisée et à laisser le bibliothécaire déterminer les exportations de toutes les directives les fichiers sources. Cependant, je préfère les fichiers de définition du module dans les directives source.]

  • Créer un projet C++ qui contient toutes les sources C++ et C++ construit le DLL. Ce projet doit dépendre du projet de bibliothèque statique Fortran et du lien avec la bibliothèque d'importation générée par le projet de bibliothèque statique Fortran.Créez un projet DLL Fortran, avec le même nom de base que le DLL Fortran, qui contient un fichier source Fortran factice contenant uniquement des commentaires (ceci afin d'éviter que le système de construction ne soit confondu). Ce projet DLL doit dépendre du projet DLL C++ et être lié à la bibliothèque d'importation générée par le projet C++. Dans les propriétés du projet, sous Lieur> Entrée> Dépendances supplémentaires, ajoutez également dans la bibliothèque statique (pas la bibliothèque d'importation!) Et exporte le fichier généré par le projet de bibliothèque statique Fortran.

D'autres clients directs de la DLL Fortran doivent se lier à la bibliothèque d'importation générée par l'étape de génération personnalisée du projet de bibliothèque statique Fortran.

Des variantes de cette approche sont possibles.