2008-10-09 10 views
4

Ceci est un problème très fondamental qui me frustrer pour le moment. Disons dans une seule solution, j'ai deux projets. Appelons le premier projet SimpleMath. Il a un fichier d'en-tête « Add.h » qui aVisual C++ symbole externe non résolu (ne peut pas trouver une de mes propres fonctions)

int add(int i, int j) 

et la mise en œuvre « Add.cpp » qui a

int add(int i, int j) { 
    return i+j; 
} 

Maintenant, disons que dans un deuxième projet, je veux utiliser la fonction add . Cependant, ce code:

#include ".. \ SimpleMath \ Add.h"

int main() { 

    add(1, 2); 

} 

résultats dans "symbole externe non résolu". Comment puis-je obtenir le deuxième programme à «savoir» sur l'implémentation réelle dans le fichier .cpp. Comme note secondaire tout le code est fictif ce n'est pas comment je programme réellement.

Répondre

3

Vous devez ajouter Add.cpp à une bibliothèque et l'inclure dans les deux projets. ou vous devez ajouter Add.cpp à votre deuxième projet aussi. Editer: pour faire de SimpleMath une bibliothèque aller dans les paramètres du projet sur Général et changer le type de configuration en Statique Lib.

Ensuite, allez dans les paramètres de votre solution, cliquez sur Dépendances du projet, puis sélectionnez votre second projet dans la liste déroulante et cochez la case en regard de SimpleMath. Cela liera automatiquement SimpleMath à votre deuxième projet, et s'assurera également que toutes les modifications apportées à SimpleMath seront reconstruites lors de la reconstruction de votre deuxième projet.

1

SimpleMath doit être défini comme un fichier de bibliothèque (.LIB) dans ses propriétés de projet. Je suppose qu'il s'agit d'un C++ non géré (non-Net). Incluez ensuite SimpleMath.lib dans l'autre projet.

+0

Je m'excuse pour le necropost, mais cela semble être la réponse la plus pertinente pour ce que j'essaie de faire. Quelle est la syntaxe pour inclure une bibliothèque? Just '#include" MyLibrary.lib'? – Maxpm

5

La raison de l'erreur que vous obtenez est que, en incluant le fichier d'en-tête vous indiquez au compilateur qu'il y est un symbole

int add (int, int) 

qui sera présent lors de la liaison, mais vous ne l'avez pas fait inclus ce symbole (le code de la fonction) dans votre projet. Un moyen rapide de résoudre le problème est d'ajouter simplement Add.cpp aux deux projets. Mais la "bonne" solution serait probablement de faire SimpleMath dans une bibliothèque au lieu d'une application en changeant le type de projet dans les propriétés du projet. En passant, vous avez probablement besoin d'un mécanisme en place pour empêcher l'inclusion multiple de ce fichier d'en-tête. J'utilise habituellement #pragma once ce qui devrait aller si vous vous en tenez à Visual C++ mais cela peut ne pas être entièrement portable, donc si vous voulez la portabilité, utilisez l'approche plus traditionnelle du fichier d'en-tête #ifndef comme suit:

#ifndef __ADD_H 
#define __ADD_H 

int add (int i, int j); 

#endif 

Bonne chance.

+0

Les nouveaux compilateurs supportent #pragma une fois la directive, on peut l'utiliser à la place de l'en-tête –

+0

Les plus récents peuvent être, mais les anciens ne le sont toujours pas. – Tara

5

Si vous essayez de relier les bibliothèques C en C++ projets, vous aurez besoin de faire quelque chose comme

extern "C" { 
    #include "..\SimpleMath\Add.h" 
} 

comme C et C++ utilisent des noms de symboles.

0

Je viens d'avoir ce problème dans le même projet ... Après avoir examiné attentivement mon code, je remarque que le code en essayant d'appeler la fonction était à l'aide d'une interface (par une méthode virtuelle pure appel = 0) . Cependant, J'ai oublié d'ajouter le mot "virtuel" dans la classe d'interface et la classe d'implémentation. Une fois que j'ai ajouté le "virtuel" le problème a été résolu.

0

Juste eu dans le même projet ainsi, s'avère que j'avais deux filtres et nommé deux fichiers .cpp le même nom. Ainsi, Visual Studio vient d'écraser un fichier .obj lors de la compilation de l'autre. Résultant dans les fonctions manquantes dans le premier .obj. Leçon: ne nommez jamais les fichiers .cpp de la même manière, même dans des dossiers/filtres différents.

Questions connexes