2013-06-16 4 views
5

Sto riscontrando un errore strano quando si tenta di eseguire un'applicazione (che non ho modificato il codice per un po 'mentre funziona correttamente) che collega alla mia DLL. Questa DLL funzionava, ma ho apportato modifiche al codice della DLL e l'ho compilato correttamente. Sfortunatamente, quando provo a eseguire l'applicazione ...Punto di ingresso non trovato

--------------------------- 
GameTest001.exe - Entry Point Not Found 
--------------------------- 
The procedure entry point [email protected]@[email protected]@@Z could not be located in the dynamic link library Renderer02.dll. 
--------------------------- 
OK 
--------------------------- 

Non ho idea di come interpretare questo errore. So quali cambiamenti ho apportato e il mio codice mi sembra soddisfacente. Ho provato a fare ricerche su Google e non ho avuto fortuna.

Qualcuno può dare qualche idea a questo? Cosa significa questo errore?

risposta

2

Si sta eseguendo il collegamento a una funzione che è stata esportata con un nome storpiato e tale nome è [email protected]@[email protected]@@Z. La DLL che viene caricata non esporta una funzione di quel nome e quindi l'errore.

Il nome mangling codifica il nome, i parametri e il valore restituito della funzione. Quindi la causa più probabile della mancata corrispondenza è che il nome, i parametri o il valore di ritorno della funzione sono stati modificati in un posto ma non nell'altro.

Se è stata modificata la DLL, sarà necessario ricompilarla per produrre nuovi file .lib e .dll. Avrai anche modificato il file .h. Assicurarsi che le versioni modificate di tutti e tre di questi file siano utilizzate dal programma che si collega alla DLL.

Questo messaggio di errore è in realtà utile per voi perché farà in modo che entrambi i lati dell'interfaccia coincidano prima di poter procedere all'esecuzione del codice.

Aggiornamento

io non ce l'ha fatta abbastanza chiaro nel testo di cui sopra. Ogni volta che si modifica l'interfaccia della DLL, è necessario effettuare le seguenti operazioni:

  1. Aggiornare eventuali file .h utilizzati dall'applicazione.
  2. Ricompilare la DLL per produrre nuovi file .lib e .dll.
  3. Ricompilare l'applicazione utilizzando i file .lib e .h aggiornati.
  4. Distribuire il nuovo file dll in modo che l'applicazione aggiornata carichi la DLL aggiornata.
+0

avevo ricostruito la DLL ei file lib molte volte senza alcun risultato. Tuttavia sembra che in realtà ho bisogno di ricostruire l'applicazione che non ho bisogno di ricostruire per settimane che ha utilizzato ogni nuova versione della DLL. – Interminable

+0

Sì, è quello che ho detto. Hai modificato la DLL e quindi per poter utilizzare il nuovo file .dll devi compilare l'applicazione con nuove versioni dei file .h e .lib. –

+0

Non hai detto che avevo bisogno di ricompilare l'applicazione (le precedenti modifiche alla DLL non richiedevano la necessità di ricompilare l'applicazione). – Interminable

2

Sembra che la funzione Music::Music(class Music const &) non sia presente nella DLL. [email protected]@[email protected]@@Z è il nome storpiato per questa funzione. È possibile demarcare i nomi delle funzioni utilizzando this site.

+0

Mille grazie per quel sito! – Interminable

+0

Demangling non risolverà il problema. La soluzione è assicurarsi che sia la DLL sia l'app corrispondano. –

+1

Sì, ma sapere quali sono effettivamente le cose in via di demarcazione è ancora utile, sicuramente? – Interminable

0

Prova questo nel vostro codice C++

extern "C" 
{ 
    inline __declspec(dllexport) int MyFunction() 
    { 
    return 63; 
    } 
}