Domanda

Sono nuovo di C ++ gestito.

Ho due progetti gestiti C ++ in un unico .sln, progetto Lib e Project LibTest. LibTest fa uso di Lib.

Lib compila e collega bene. Il progetto è impostato come una dll.

LibTest è anche compilato come .dll, ma quando si va in collegamento, ottengo "gettone irrisolto" su tutti i Lib :: metodi. Tali definizioni metodi sono definiti nel file cpp Lib.

Se ho spostato le definizioni nel file Lib.h, tutto funziona.

Ho già modificato riferimento di LibTest dipendere progetto Lib.

Che cosa mi manca?

Modifica :. Va bene qui è esattamente quello che ho e che ancora non funziona

Prima di tutto, sto usando Visual Studio 2008 SP1.

In secondo luogo, quando ho fatto un esercizio simile in C #, ha funzionato bene.

Ho creato un progetto vuoto C ++ CLR. Ho aggiunto un progetto Lib. Ho aggiunto una classe gestita. VSTD generato Lib.h e Lib.cpp. Il costruttore viene generato automaticamente.

Poi ho aggiunto un altro progetto per la mia soluzione; Ho chiamato LibTest. Ho aggiunto un altro classe gestita chiamato LibTest. LibTest.h e LibTest.cpp vengono generati. Ho cercato di creare un'istanza Lib nel costruttore LibTest, ma durante collegandolo semplicemente detto:

1> LibTest.obj: l'errore LNK2020:. Token irrisolto (06.000.002) Lib :: ctor

Ecco il codice esatto:

Lib Progetto (compilato come DLL progetto)

//Lib.h
#pragma once

ref class Lib
{
public:
  Lib(void);
};


//Lib.cpp
#include "Lib.h"

Lib::Lib(void)
{
}

LibTest Progetto (compilato come applicazione.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;
}
È stato utile?

Soluzione

C ++ gestito funziona proprio come C # per quanto riguarda i tipi di diverse assemblee. Ciò significa che è necessario dichiarare la classe Lib come public:

public ref class Lib

E non si dovrebbe includere Lib.h nel progetto LibTest. Quando si aggiunge il riferimento al progetto Lib, il compilatore sarà in grado di risolvere eventuali simboli che vi si trovano.

Il codice attuale comprende Lib.h, e così le ricerche linker per la classe Lib nell'assemblea LibTest e cerca il costruttore lì.

Altri suggerimenti

Se utilizzi le estensioni gestite, impostando il riferimento corretto dovrebbe essere tutto ciò che serve.

Se si sta utilizzando funzioni standard C ++, probabilmente è necessario definire le funzioni che utilizzano __declspec(dllexport) e __declspec(dllimport). Vedere MSDN per i dettagli .

__declspec(dllexport) è quello che aggiunge funzioni specifiche nella libreria di esportazione, e __declspec(dllimport) racconta la libreria di importazione (LibTest) che ha bisogno di importare quei simboli dalla DLL.

Nel progetto LibTest, proprietà-> Configurazione proprietà-> Linker-> INPUT-> set dependecies supplementari, includere Lib.lib

Ecco la modifica finale come proposto da Bojan. Grazie Bojan!

Nota: Dont't dimenticare di aggiungere "Lib" al tuo "LibTest" di riferimento

!

Lib Progetto (compilato come DLL progetto)

// Lib.h

#pragma once

public ref class Lib
{
public:
  Lib(void);
};

// Lib.cpp

#include "Lib.h"

Lib::Lib(void)
{
}

LibTest Progetto (compilato come applicazione.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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top