Comment résoudre l’erreur LNK2019: symbole externe non résolu – fonction?

Je reçois cette erreur, mais je ne sais pas comment le réparer.

J’utilise Visual Studio 2013. J’ai fait le nom de la solution MyProjectTest Voici la structure de ma solution de test:

La structure

function.h

#ifndef MY_FUNCTION_H #define MY_FUNCTION_H int multiple(int x, int y); #endif 

-function.cpp

 #include "function.h" int multiple(int x, int y){ return x*y; } 

main.cpp

 #include  #include  #include "function.h" using namespace std; int main(){ int a, b; cin >> a >> b; cout << multiple(a, b) << endl; system("pause"); return 0; } 

Je suis un débutant; c’est un programme simple et il fonctionne sans erreur. J’ai lu sur internet et je me suis intéressé au test unitaire. J’ai donc créé un projet de test:

Fichier> Nouveau> Projet …> Installé> Modèles> Visual C ++> Test> Projet de test d’unité natif>

Nom: UnitTest1 Solution: Ajouter à la solution Ensuite, l’emplacement basculé automatiquement vers le chemin de la solution ouverte actuelle. Il s’agit de la structure de dossiers de la solution:

Structure de dossier

J’ai seulement édité le fichier unittest1.cpp:

 #include "stdafx.h" #include "CppUnitTest.h" #include "../MyProjectTest/function.h" using namespace Microsoft::VisualStudio::CppUnitTestFramework; namespace UnitTest1 { TEST_CLASS(UnitTest1) { public: TEST_METHOD(TestEqual) { Assert::AreEqual(multiple(2, 3), 6); // TODO: Your test code here } }; } 

Mais j’obtiens l’erreur LNK2019: symbole externe non résolu. Je sais que l’implémentation de la fonction multiple est manquante. J’ai essayé de supprimer le fichier function.cpp et j’ai remplacé la déclaration par la définition. Mais écrire à la fois la déclaration et la définition dans le même fichier n’est pas recommandé. Comment puis-je corriger cette erreur sans le faire? Dois-je remplacer par #include "../MyProjectTest/function.cpp" dans le fichier unittest.cpp? (Je ne suis pas très bon en anglais. Merci)

Une option serait d’inclure function.cpp dans votre projet UnitTest1 , mais ce n’est peut-être pas la structure de solution la plus idéale. La réponse courte à votre problème est que, lors de la création de votre projet UnitTest1 , le compilateur et l’éditeur de liens ne UnitTest1 pas que function.cpp existe et n’ont rien à lier qui contient une définition de multiple . Un moyen de résoudre ce problème est d’utiliser les bibliothèques de liens.

Comme vos tests unitaires sont dans un projet différent, je suppose que votre intention est de faire de ce projet un programme de test unitaire autonome. Avec les fonctions que vous testez situées dans un autre projet, il est possible de construire ce projet sur une bibliothèque liée dynamicment ou statiquement. Les bibliothèques statiques sont liées aux autres programmes au moment de la construction et ont l’extension .lib . Les bibliothèques dynamics sont liées à l’exécution et ont l’extension .dll . Pour ma réponse, je préférerais les bibliothèques statiques.

Vous pouvez transformer votre premier programme en bibliothèque statique en le modifiant dans les propriétés du projet. Il devrait y avoir une option sous l’onglet Général où le projet est configuré pour générer un fichier exécutable ( .exe ). Vous pouvez changer ceci en .lib . Le fichier .lib sera construit au même endroit que le .exe .

Dans votre projet UnitTest1 , vous pouvez accéder à ses propriétés et, sous l’onglet Linker de la catégorie Additional Library Directories, append le chemin d’access à la construction de MyProjectTest . Ensuite, pour les dépendances supplémentaires sous l’onglet Linker – Input, ajoutez le nom de votre bibliothèque statique, probablement MyProjectTest.lib .

Cela devrait permettre à votre projet de se développer. Notez que, ce faisant, MyProjectTest ne sera pas un programme exécutable autonome à moins que vous ne modifiiez ses propriétés de construction, ce qui ne serait pas idéal.

Dans l’arborescence de solutions Visual Studio, cliquez avec le bouton droit sur le projet ‘UnitTest1’, puis sur Ajouter -> élément existant -> choisissez le fichier ../MyProjectTest/function.cpp

Puisque je veux que mon projet comstack en un EXE autonome, j’ai lié le projet UnitTest au fichier function.obj généré à partir de la fonction.cpp et cela fonctionne. Faites un clic droit sur le projet ‘UnitTest1’> Propriétés de configuration> Linker> Input> Additional Dependencies> ajoutez “.. \ MyProjectTest \ Debug \ function.obj”

Il s’est avéré que j’utilisais des fichiers .c avec des fichiers .cpp. renommer .c à .cpp a résolu mon problème.

Je viens de rencontrer ce problème dans Visual Studio 2013. Apparemment, avoir deux projets dans la même solution et définir les dépendances ne suffit pas. Vous devez append une référence de projet entre eux. Pour faire ça:

  1. Cliquez avec le bouton droit sur le projet dans la solution explore
  2. Cliquez sur Ajouter => Références …
  3. Cliquez sur le bouton Ajouter une nouvelle référence
  4. Cochez les cases correspondant aux projets sur lesquels ce projet s’appuie
  5. Cliquez sur OK

Si vous exportez une instance d’une classe depuis une DLL mais que vous ne l’avez pas déclarée en tant qu’importation / exportation, vous pouvez également obtenir cette erreur.

  #ifdef MYDLL_EXPORTS #define DLLEXPORT __declspec(dllexport) #else #define DLLEXPORT __declspec(dllimport) #endif class DLLEXPORT Book // < --- this class must also be declared as export/import { public: Book(); ~Book(); int WordCount(); }; DLLEXPORT extern Book book; // <-- This is what I really wanted, to export book object 

Donc, même si j'exportais principalement une instance de la classe Book appelée book ci-dessus, je devais déclarer la classe Book comme classe d'exportation / importation, sinon l'appel de book.WordCount() dans l'autre DLL provoquait une erreur de lien.

Je viens de découvrir que LNK2019 se produit lors de la compilation dans Visual Studio 2015 si l’on oublie de fournir une définition pour une fonction déclarée dans une classe.

L’erreur de l’éditeur de liens était très cryptique mais j’ai réduit ce qui manquait en lisant l’erreur et j’ai fourni la définition en dehors de la classe pour clarifier cela.

Pour moi, si j’ajoute cette ligne ci-dessous dans .vcxproj dans le fichier cpp itemGroup , qui est connecté au fichier d’en-tête.

  

Cela m’est arrivé alors j’ai pensé que je pourrais partager ma solution, aussi simple soit-il:

Vérifiez le jeu de caractères des deux projets dans Propriétés de configuration -> Général -> Jeu de caractères

Mon projet UnitTest utilisait le jeu de caractères multi-octets par défaut lorsque mes bibliothèques étaient en Unicode .
Ma fonction utilisait un paramètre TCHAR . Comme résultat dans ma librairie, mon TCHAR a été transformé en WCHAR mais c’était un char * sur mon UnitTest: le symbole était différent car les parameters n’étaient pas vraiment les mêmes à la fin.

Dans Visual Studio 2017, si vous souhaitez tester des membres publics, placez simplement votre projet réel et votre projet de test dans la même solution et ajoutez une référence à votre projet réel dans le projet de test.

Voir Tests unitaires C ++ dans Visual Studio à partir du blog MSDN pour plus de détails. Vous pouvez également vérifier les tests unitaires d’écriture pour C / C ++ dans Visual Studio ainsi que Utiliser le framework de test unitaire Microsoft pour C ++ dans Visual Studio , ce dernier étant nécessaire pour tester des membres non publics et pour mettre les tests dans le même projet. comme votre vrai code.

Notez que les choses que vous voulez tester devront être exscopes en utilisant __declspec(dllexport) . Voir Exportation à partir d’une DLL à l’aide de __declspec (dllexport) pour plus de détails.