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;
}
War es hilfreich?

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top