J'obtiens cette erreur, mais je ne sais pas comment la corriger.
J'utilise Visual Studio 2013. J'ai créé le nom de la solution MyProjectTest Voici la structure de ma solution de test:
- fonction.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 <iostream>
#include <cstdlib>
#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é native>
Nom: UnitTest1 Solution: Ajouter à la solution Ensuite, l'emplacement est automatiquement basculé vers le chemin de la solution ouverte actuelle Voici la structure de dossiers de la solution:
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, et elle a fonctionné. 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 faire cela? Dois-je remplacer par #include "../MyProjectTest/function.cpp"
dans le fichier unittest.cpp?
(Je ne suis pas très bon en anglais. Merci)
la source
.LIB
extension de fichier. Pour compliquer les choses ... les bibliothèques de liens dynamiques (c'est-à-dire*.DLL
) peuvent avoir une bibliothèque d'importation associée qui a également une.LIB
extension de fichier. Cette bibliothèque d'importation répertorie tous les goodies fournis par le*.DLL
. Pour plus d'informations, veuillez lire: Guide du débutant sur lesRéponses:
Une option serait d'inclure
function.cpp
dans votreUnitTest1
projet, 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 construction de votreUnitTest1
projet, le compilateur et l'éditeur de liens n'ont aucune idée de ce quifunction.cpp
existe et n'ont aucun lien contenant une définition demultiple
. Un moyen de résoudre ce problème consiste à utiliser des bibliothèques de liaison.Étant donné que 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 créer ce projet dans une bibliothèque liée dynamiquement ou statiquement. Les bibliothèques statiques sont liées à d'autres programmes au moment de la construction, et ont l'extension
.lib
, et les bibliothèques dynamiques sont liées au moment de l'exécution et ont l'extension.dll
. Pour ma réponse, je préfère 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 exécutable (
.exe
). Vous pouvez changer cela en.lib
. Le.lib
fichier sera généré au même endroit que le fichier.exe
.Dans votre
UnitTest1
projet, vous pouvez accéder à ses propriétés, et sous l'onglet Éditeur de liens dans la catégorie Répertoires de bibliothèques supplémentaires, ajoutez le chemin d'accès auxMyProjectTest
builds. Ensuite, pour les dépendances supplémentaires sous l'onglet Éditeur de liens - Entrée, ajoutez le nom de votre bibliothèque statique, très probablementMyProjectTest.lib
.Cela devrait permettre à votre projet de se construire. Notez qu'en faisant cela,
MyProjectTest
ne sera pas un programme exécutable autonome à moins que vous ne modifiiez ses propriétés de construction si nécessaire, ce qui serait loin d'être idéal.la source
Dans l'arborescence de la solution Visual Studio, cliquez avec le bouton droit sur le projet 'UnitTest1' puis Ajouter -> Élément existant -> choisissez le fichier ../MyProjectTest/function.cpp
la source
Puisque je veux que mon projet soit compilé sur un EXE autonome, j'ai lié le projet UnitTest au fichier function.obj généré à partir de function.cpp et cela fonctionne. Cliquez avec le bouton droit sur le projet 'UnitTest1'> Propriétés de configuration> Linker> Input> Additional Dependencies> add ".. \ MyProjectTest \ Debug \ function.obj"
la source
Je viens de rencontrer ce problème dans Visual Studio 2013. Apparemment maintenant, avoir deux projets dans la même solution et définir les dépendances ne suffit pas. Vous devez ajouter une référence de projet entre eux. Pour faire ça:
la source
il s'est avéré que j'utilisais des fichiers .c avec des fichiers .cpp. renommer .c en .cpp a résolu mon problème.
la source
Une autre façon d'obtenir cette erreur de l'éditeur de liens (comme je l'étais) est si vous exportez une instance d'une classe à partir d'une DLL mais que vous n'avez pas déclaré cette classe elle-même comme import / export.
Donc, même si principalement j'exportais juste une instance de la classe Book appelée
book
ci-dessus, j'ai dû déclarer laBook
classe comme classe d'exportation / importation, sinon l'appelbook.WordCount()
de l'autre dll provoquait une erreur de lien.la source
Cela m'est arrivé alors j'ai pensé que je pourrais partager ma solution, aussi simple soit-elle:
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 par défaut multi-octets alors que mes bibliothèques étaient en Unicode .
Ma fonction utilisait un TCHAR comme paramètre. En conséquence, dans ma lib, mon TCHAR était transformé en un WCHAR mais c'était un char * sur mon UnitTest: le symbole était différent car les paramètres n'étaient vraiment pas les mêmes à la fin.
la source
Je viens de découvrir que
LNK2019
se produit lors de la compilation dans Visual Studio 2015 si vous oubliez 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.
la source
dans mon cas, définissez le fichier cpp sur "compilateur C / C ++" dans la propriété -> résolution générale de l'erreur LNK2019.
la source
Pour moi fonctionne, si j'ajoute ce soufflet ligne
.vcxproj
dans leitemGroup
fichier cpp, qui est relié au fichier d' en- tête.la source
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.
Consultez Test unitaire C ++ dans Visual Studio à partir du blog MSDN pour plus de détails. Vous pouvez également vérifier Écrire des tests unitaires pour C / C ++ dans Visual Studio ainsi que Utiliser le Microsoft Unit Testing Framework pour C ++ dans Visual Studio , ce dernier étant si vous avez besoin de tester des membres non publics et devez placer les tests dans le même projet comme votre vrai code.
Notez que les éléments que vous souhaitez tester devront être exportés à l'aide de
__declspec(dllexport)
. Voir Exportation à partir d'une DLL à l'aide de __declspec (dllexport) pour plus de détails.la source