Ich erhalte diesen Fehler, weiß aber nicht, wie ich ihn beheben soll.
Ich verwende Visual Studio 2013. Ich habe den Lösungsnamen MyProjectTest erstellt. Dies ist die Struktur meiner Testlösung:
- 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 <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;
}
Ich bin ein Anfänger; Dies ist ein einfaches Programm, das fehlerfrei ausgeführt wird. Ich habe im Internet gelesen und mich für den Unit-Test interessiert, also habe ich ein Testprojekt erstellt:
Datei> Neu> Projekt ...> Installiert> Vorlagen> Visual C ++> Test> Native Unit Test Project>
Name: UnitTest1 Lösung: Zur Lösung hinzufügen Dann wird der Speicherort automatisch auf den Pfad der aktuell geöffneten Lösung umgeschaltet. Dies ist die Ordnerstruktur der Lösung:
Ich habe nur die Datei unittest1.cpp bearbeitet:
#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
}
};
}
Aber ich bekomme den Fehler LNK2019: ungelöstes externes Symbol. Ich weiß, dass die Implementierung der Funktion multiple fehlt. Ich habe versucht, die Datei function.cpp zu löschen, die Deklaration durch die Definition ersetzt und sie ausgeführt. Es wird jedoch nicht empfohlen, sowohl die Deklaration als auch die Definition in dieselbe Datei zu schreiben. Wie kann ich diesen Fehler beheben, ohne das zu tun? Sollte ich durch #include "../MyProjectTest/function.cpp"
in der Datei unittest.cpp ersetzen ?
(Ich kann nicht sehr gut Englisch. Danke)
quelle
.LIB
Dateierweiterung. Um die Sache zu verkomplizieren ... können dynamische Linkbibliotheken (dh*.DLL
) eine zugehörige Importbibliothek haben, die auch eine.LIB
Dateierweiterung hat. Diese Importbibliothek listet alle von der*.DLL
. Weitere Informationen finden Sie unter: Anfängerleitfaden für LinkerAntworten:
Eine Möglichkeit wäre,
function.cpp
in IhrUnitTest1
Projekt aufzunehmen, aber dies ist möglicherweise nicht die idealste Lösungsstruktur. Die kurze Antwort auf Ihr Problem lautet, dassUnitTest1
der Compiler und der Linker beim Erstellen Ihres Projekts keine Ahnung haben, wasfunction.cpp
vorhanden ist, und auch nichts zu verknüpfen haben, das eine Definition von enthältmultiple
. Eine Möglichkeit, dies zu beheben, besteht darin, Bibliotheken zu verknüpfen.Da sich Ihre Unit-Tests in einem anderen Projekt befinden, gehe ich davon aus, dass Sie beabsichtigen, dieses Projekt zu einem eigenständigen Unit-Test-Programm zu machen. Mit den Funktionen, die Sie testen, in einem anderen Projekt können Sie dieses Projekt entweder in einer dynamisch oder statisch verknüpften Bibliothek erstellen. Statische Bibliotheken sind zur Erstellungszeit mit anderen Programmen verknüpft und haben die Erweiterung
.lib
, und dynamische Bibliotheken sind zur Laufzeit verknüpft und haben die Erweiterung.dll
. Für meine Antwort bevorzuge ich statische Bibliotheken.Sie können Ihr erstes Programm in eine statische Bibliothek verwandeln, indem Sie es in den Projekteigenschaften ändern. Auf der Registerkarte Allgemein sollte eine Option vorhanden sein, mit der das Projekt auf eine ausführbare Datei (
.exe
) erstellt werden soll. Sie können dies in ändern.lib
. Die.lib
Datei wird an derselben Stelle wie die erstellt.exe
.In Ihrem
UnitTest1
Projekt können Sie zu seinen Eigenschaften wechseln und auf der Registerkarte Linker in der Kategorie Zusätzliche Bibliotheksverzeichnisse den Pfad hinzufügen, zu demMyProjectTest
Builds erstellt werden. Fügen Sie dann für zusätzliche Abhängigkeiten auf der Registerkarte Linker - Eingabe höchstwahrscheinlich den Namen Ihrer statischen Bibliothek hinzuMyProjectTest.lib
.Damit sollte Ihr Projekt erstellt werden können. Beachten Sie, dass dies
MyProjectTest
kein eigenständiges ausführbares Programm ist, es sei denn, Sie ändern die Build-Eigenschaften nach Bedarf, was nicht ideal wäre.quelle
Klicken Sie im Visual Studio-Lösungsbaum mit der rechten Maustaste auf das Projekt 'UnitTest1' und dann auf Hinzufügen -> Vorhandenes Element -> wählen Sie die Datei ../MyProjectTest/function.cpp
quelle
Da ich möchte, dass mein Projekt zu einer eigenständigen EXE-Datei kompiliert wird, habe ich das UnitTest-Projekt mit der aus der function.cpp generierten Datei function.obj verknüpft und es funktioniert. Klicken Sie mit der rechten Maustaste auf das Projekt 'UnitTest1'> Konfigurationseigenschaften> Linker> Eingabe> Zusätzliche Abhängigkeiten> fügen Sie ".. \ MyProjectTest \ Debug \ function.obj" hinzu.
quelle
Ich bin gerade in Visual Studio 2013 auf dieses Problem gestoßen. Anscheinend reicht es jetzt nicht mehr aus, zwei Projekte in derselben Lösung zu haben und die Abhängigkeiten festzulegen. Sie müssen eine Projektreferenz zwischen ihnen hinzufügen. Das zu tun:
quelle
Es stellte sich heraus, dass ich .c-Dateien mit .cpp-Dateien verwendete. Das Umbenennen von .c in .cpp hat mein Problem gelöst.
quelle
Eine andere Möglichkeit, diesen Linkerfehler zu erhalten (wie ich es war), besteht darin, dass Sie eine Instanz einer Klasse aus einer DLL exportieren , diese Klasse selbst jedoch nicht als Import / Export deklariert haben.
Obwohl ich hauptsächlich nur eine Instanz der
book
oben genannten Book-Klasse exportierte , musste ich dieBook
Klasse auch als Export- / Importklasse deklarieren, da sonst das Aufrufenbook.WordCount()
der anderen DLL einen Linkfehler verursachte.quelle
Dies passierte mir und ich dachte, ich könnte meine Lösung teilen, so einfach es war:
Überprüfen Sie den Zeichensatz beider Projekte unter Konfigurationseigenschaften -> Allgemein -> Zeichensatz
Mein UnitTest-Projekt verwendete das Standard-Zeichensatz- Multi-Byte, während sich meine Bibliotheken in Unicode befanden .
Meine Funktion war die Verwendung eines TCHAR als Parameter. Als Ergebnis in meinem lib meines TCHAR wurde umgewandelt in eine WCHAR aber es war ein char * auf meinem Unittest: Das Symbol war anders , weil die Parameter am Ende wirklich nicht das gleiche waren.
quelle
Ich habe gerade festgestellt, dass dies
LNK2019
beim Kompilieren in Visual Studio 2015 auftritt, wenn vergessen wird, eine Definition für eine deklarierte Funktion innerhalb einer Klasse anzugeben.Der Linker-Fehler war sehr kryptisch, aber ich habe das Fehlen eingegrenzt, indem ich den Fehler durchgelesen und die Definition außerhalb der Klasse angegeben habe, um dies zu klären.
quelle
In meinem Fall setzen Sie die CPP-Datei in der Eigenschaft -> Allgemein, um den LNK2019-Fehler zu beheben, auf "C / C ++ - Compiler".
quelle
Für mich funktioniert, wenn ich diese Zeile unten
.vcxproj
in dieitemGroup
CPP-Datei einfüge, die mit der Header-Datei verbunden ist.quelle
Wenn Sie in Visual Studio 2017 öffentliche Mitglieder testen möchten, fügen Sie einfach Ihr reales Projekt und Ihr Testprojekt in dieselbe Lösung ein und fügen Sie im Testprojekt einen Verweis auf Ihr reales Projekt hinzu.
Weitere Informationen finden Sie unter C ++ - Komponententests in Visual Studio im MSDN-Blog. Sie können auch Unit-Tests für C / C ++ in Visual Studio schreiben sowie Microsoft Unit Testing Framework für C ++ in Visual Studio verwenden aktivieren . Letzteres gilt, wenn Sie nicht öffentliche Mitglieder testen und die Tests in dasselbe Projekt einfügen müssen als dein echter Code.
Beachten Sie, dass Dinge, die Sie testen möchten, mit exportiert werden müssen
__declspec(dllexport)
. Weitere Informationen finden Sie unter Exportieren aus einer DLL mit __declspec (dllexport) .quelle