Managed C++ non risolti token

Sono nuovo di managed C++.

Ho due C++ gestito progetti in un unico .sln, Progetto Lib e Progetto LibTest. LibTest fa uso di Lib.

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

LibTest inoltre è compilato come .dll, ma quando si va in collegamento, ho non risolti “token” su tutte le Lib::metodi. Tali metodi definizioni sono definiti nel Lib .file cpp.

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

Ho già modificato LibTest di Riferimento dipendono Lib progetto.

Che cosa mi manca?

MODIFICA: Ok qui è esattamente quello che ho e ancora non funziona.

Prima di tutto, sto utilizzando Visual Studio 2008 SP1.

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

Ho creato un vuoto C++ CLR progetto. Ho aggiunto un Lib progetto. 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’altra classe gestita chiamato LibTest. LibTest.h e LibTest.cpp vengono generati. Ho provato a creare un’istanza di Lib in LibTest costruttore, ma durante il collegamento semplicemente detto:

1>LibTest.obj : error degli lnk2020: non risolti token (06000002) Lib::.ctor

Ecco il codice esatto:

Lib Progetto (compilato come .progetto dll)

//Lib.h
#pragma once

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


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

Lib::Lib(void)
{
}

LibTest Progetto (compilato come application.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;
}
Wow..devo dire..provenienti da unmanaged C++..ho SEMPRE voluto l’ambiente di sviluppo (in questo caso il VSTD IDE) per gestire l’ #include, e tutte le libreria di collegamento senza di me dover specificare in modo esplicito. Questo è piuttosto sorprendente! Vorrei dire a tutto il C++ non gestito mondiale di questo! (Sono solo 6 anni alle spalle! =p)

OriginaleL’autore sivabudh | 2009-06-01

4 Replies
  1. 9

    Managed C++ funziona proprio come il C# in materia di tipi di gruppi diversi. Che cosa questo significa è che avete bisogno di per dichiarare il vostro Lib classe public:

    public ref class Lib
    

    E non è necessario includere Lib.h nel LibTest progetto. Quando si aggiunge il riferimento al Lib progetto, il compilatore sarà in grado di risolvere qualsiasi dei simboli che si trovano lì.

    Corrente codice include Lib.h, e in modo che il linker cerca per la Lib classe in LibTest assemblea e cerca il costruttore c’.

    Grazie, Bojan; problema risolto. Vorrei poter avere votato per voi 10 volte..ma stackoverflow consente solo 1. 😉
    In qualsiasi momento – sono contento che aiutato 🙂

    OriginaleL’autore Bojan Resnik

  2. 1

    Se si sta utilizzando le estensioni gestite riferimento correttamente dovrebbe essere tutto il necessario.

    Se si utilizza standard di C++ funzioni, probabilmente è necessario definire le funzioni utilizzando __declspec(dllexport) e __declspec(dllimport). Vedi MSDN per i dettagli.

    __declspec(dllexport) è ciò che aggiunge funzioni specifiche nella libreria di esportazione, e __declspec(dllimport) racconta la libreria di importazione (LibTest) che è necessario importare i simboli dall’DLL.

    sì…sono tutti gestiti. questo è davvero sconcertante.

    OriginaleL’autore Reed Copsey

  3. 1

    Nel progetto LibTest, proprietà->proprietà-Configurazione->il Linker->Ingresso->impostare altre Dipendenze, includono Lib.lib

    OriginaleL’autore Penny

  4. 0

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

    Nota: non dimenticate di aggiungere il “Lib” di la tua “LibTest” di Riferimento!

    Lib Progetto (compilato come .progetto dll)

    //Lib.h

    #pragma once
    
    public ref class Lib
    {
    public:
      Lib(void);
    };
    

    //Lib.cpp

    #include "Lib.h"
    
    Lib::Lib(void)
    {
    }
    

    LibTest Progetto (compilato come application.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;
    }
    

    OriginaleL’autore sivabudh

Lascia un commento