Frage
Ich bin neu in Managed C ++.
Ich habe zwei verwaltete C ++ Projekte in einem einzigen SLN, Projekt Lib und Projekt libtest. Libtest macht Gebrauch von Lib.
Lib kompiliert und verknüpft in Ordnung. Das Projekt wird als DLL.
libtest wird auch als DLL kompiliert wird, aber wenn es geht in der Verknüpfung, erhalte ich „ungelöste Token“ auf alle der Lib :: Methoden. Diese Methoden-Definitionen werden in der Lib-CPP-Datei definiert ist.
Wenn ich die Definitionen in die lib.h Datei verschoben, alles funktioniert.
Ich habe bereits libtest Referenz hängen von Lib Projekt geändert.
Was bin ich fehlt?
Bearbeiten : Okay. Hier ist genau das, was ich habe und es funktioniert immer noch nicht
Zunächst einmal, ich bin mit Visual Studio 2008 SP1.
Zweitens, wenn ich eine ähnliche Übung in C # tat, es funktioniert gut.
Ich habe ein leeres C ++ CLR-Projekt. Ich habe ein Lib-Projekt. Ich habe eine verwaltete Klasse. VSTD erzeugt lib.h und Lib.cpp. Der Konstruktor wird automatisch generiert.
Dann habe ich ein anderes Projekt zu meiner Lösung; Ich nannte es libtest. Ich habe eine andere verwaltete Klasse namens libtest. LibTest.h und LibTest.cpp erzeugt. Ich habe versucht, Lib in libtest Konstruktor zu instanziiert, aber während des Linkens es einfach gesagt:
1> LibTest.obj: error LNK2020:. Ungelöste Token (06.000.002) Lib :: Ctor
Hier ist der genaue Code:
Lib Project (als .dll-Projekt kompiliert)
//Lib.h
#pragma once
ref class Lib
{
public:
Lib(void);
};
//Lib.cpp
#include "Lib.h"
Lib::Lib(void)
{
}
libtest Project (kompiliert als anwendung.exe)
// LibTest.h
#pragma once
ref class LibTest
{
public:
LibTest(void);
};
// LibTest.cpp
#include "LibTest.h"
#include "Lib.h"
LibTest::LibTest(void)
{
Lib^ lib = gcnew Lib;
}
int main()
{
return 0;
}
Lösung
Managed C ++ wie C # in Bezug auf Typen in unterschiedlichen Baugruppen arbeitet. Was dies bedeutet ist, dass Sie Ihre Lib
Klasse als public
erklären müssen:
public ref class Lib
Und Sie sollten nicht Lib.h
in Ihrem LibTest
Projekt enthalten. Wenn Sie den Verweis auf das Lib
Projekt hinzufügen, wird der Compiler in der Lage sein, alle Symbole dort gefunden zu lösen.
Ihr aktueller Code enthält Lib.h
, und so die Linker suchen nach der Lib
Klasse in der LibTest
Montage und sucht nach dem Konstruktor gibt.
Andere Tipps
Wenn Sie verwaltete Erweiterungen verwenden, die Referenzeinstellung sollte korrekt sein, alles, was Sie brauchen.
Wenn Sie Standard-C ++ Funktionen verwenden, müssen Sie wahrscheinlich Ihre Funktionen __declspec(dllexport)
und __declspec(dllimport)
definieren. MSDN für Details .
__declspec(dllexport)
ist, welche spezifischen Funktionen in die Export-Bibliothek hinzufügt und __declspec(dllimport)
erzählt die Import-Bibliothek (libtest), dass sie diese Symbole aus der DLL importieren muss.
Im Projekt libtest, Eigentums-> Konfiguration Eigenschaften-> Linker-> Input-> set Weitere dependecies, umfassen Lib.lib
Hier ist die letzte Änderung wie von Bojan vorgeschlagen. Dank Bojan!
Hinweis: dont't vergessen "Lib" zu Ihrer "libtest" Referenz hinzufügen
!Lib Project (als .dll-Projekt kompiliert)
// lib.h
#pragma once
public ref class Lib
{
public:
Lib(void);
};
// Lib.cpp
#include "Lib.h"
Lib::Lib(void)
{
}
libtest Project (kompiliert als anwendung.exe)
// LibTest.h
#pragma once
ref class LibTest
{
public:
LibTest(void);
};
// LibTest.cpp
#include "LibTest.h"
LibTest::LibTest(void)
{
Lib^ lib = gcnew Lib;
}
int main()
{
return 0;
}