42

Spero che tu possa aiutarmi, perché non ho idea di cosa sta succedendo. Sto avendo il seguente errore durante il tentativo di aggiungere biblioteca Beecrypt al mio progetto:Errore inaspettato alla fine del file

irreversibile C1010 errore: fine inaspettata di file mentre cerca di intestazione precompilata. Hai dimenticato di aggiungere "#include" stdafx.h "" alla tua fonte?

In realtà non ho dimenticato di aggiungere #include "stdafx" alla mia fonte. I punti di compilatore l'errore di essere alla fine di questo file .cxx:

#define BEECRYPT_CXX_DLL_EXPORT 

#ifdef HAVE_CONFIG_H 
# include "config.h" 
#endif 

#include "beecrypt/c++/security/SecureRandom.h" 
#include "beecrypt/c++/security/SecureRandomSpi.h" 
#include "beecrypt/c++/security/Security.h" 

using namespace beecrypt::security; 

SecureRandom* SecureRandom::getInstance(const String& algorithm) throw  (NoSuchAlgorithmException) 
{ 
Security::spi* tmp = Security::getSpi(algorithm, "SecureRandom"); 

assert(dynamic_cast<SecureRandomSpi*>(tmp->cspi)); 

SecureRandom* result = new SecureRandom(reinterpret_cast<SecureRandomSpi*>(tmp->cspi), tmp->prov, tmp->name); 

delete tmp; 

return result; 
} 

SecureRandom* SecureRandom::getInstance(const String& type, const String& provider) throw (NoSuchAlgorithmException, NoSuchProviderException) 
    { 
Security::spi* tmp = Security::getSpi(type, "SecureRandom", provider); 

assert(dynamic_cast<SecureRandomSpi*>(tmp->cspi)); 

SecureRandom* result = new SecureRandom(reinterpret_cast<SecureRandomSpi*>(tmp->cspi), tmp->prov, tmp->name); 

delete tmp; 

return result; 
    } 

    SecureRandom* SecureRandom::getInstance(const String& type, const Provider& provider) throw (NoSuchAlgorithmException) 
    { 
Security::spi* tmp = Security::getSpi(type, "SecureRandom", provider); 

assert(dynamic_cast<SecureRandomSpi*>(tmp->cspi)); 

SecureRandom* result = new SecureRandom(reinterpret_cast<SecureRandomSpi*>(tmp->cspi), tmp->prov, tmp->name); 

delete tmp; 

return result; 
    } 

    void SecureRandom::getSeed(byte* data, int size) 
{ 
entropyGatherNext(data, size); 
} 

SecureRandom::SecureRandom() 
{ 
Security::spi* tmp = Security::getFirstSpi("SecureRandom"); 

assert(dynamic_cast<SecureRandomSpi*>((SecureRandomSpi*) tmp->cspi)); 

_rspi = (SecureRandomSpi*) tmp->cspi; 
_type = tmp->name; 
_prov = tmp->prov; 

delete tmp; 
    } 

    SecureRandom::SecureRandom(SecureRandomSpi* rspi, const Provider* provider, const String& type) 
    { 
_rspi = rspi; 
_prov = provider; 
_type = type; 
    } 

SecureRandom::~SecureRandom() 
{ 
delete _rspi; 
} 

void SecureRandom::generateSeed(byte* data, int size) 
{ 
_rspi->engineGenerateSeed(data, size); 
} 

void SecureRandom::setSeed(const byte* data, int size) 
{ 
_rspi->engineSetSeed(data, size); 
} 

    void SecureRandom::nextBytes(byte* data, int size) 
{ 
_rspi->engineNextBytes(data, size); 
} 

const String& SecureRandom::getType() const throw() 
{ 
return _type; 
} 

    const Provider& SecureRandom::getProvider() const throw() 
{ 
return *_prov; 
    } 

ed ecco h di file:

#ifndef _CLASS_BEE_SECURITY_SECURERANDOM_H 
#define _CLASS_BEE_SECURITY_SECURERANDOM_H 

#include "beecrypt/beecrypt.h" 

#ifdef __cplusplus 

#include "beecrypt/c++/security/SecureRandomSpi.h" 
using beecrypt::security::SecureRandomSpi; 
#include "beecrypt/c++/security/Provider.h" 
using beecrypt::security::Provider; 
#include "beecrypt/c++/security/NoSuchAlgorithmException.h" 
using beecrypt::security::NoSuchAlgorithmException; 
#include "beecrypt/c++/security/NoSuchProviderException.h" 
using beecrypt::security::NoSuchProviderException; 

namespace beecrypt { 
namespace security { 
    /*!\ingroup CXX_SECURITY_m 
    */ 
    class BEECRYPTCXXAPI SecureRandom : public Object 
    { 
    public: 
     static SecureRandom* getInstance(const String& type) throw (NoSuchAlgorithmException); 
     static SecureRandom* getInstance(const String& type, const String& provider) throw (NoSuchAlgorithmException, NoSuchProviderException); 
     static SecureRandom* getInstance(const String& type, const Provider& provider) throw (NoSuchAlgorithmException); 

     static void getSeed(byte*, int); 

    private: 
     SecureRandomSpi* _rspi; 
     const Provider* _prov; 
     String   _type; 

    protected: 
     SecureRandom(SecureRandomSpi* spi, const Provider* provider, const String& type); 

    public: 
     SecureRandom(); 
     virtual ~SecureRandom(); 

     void generateSeed(byte*, int); 
     void nextBytes(byte*, int); 
     void setSeed(const byte*, int); 

     const String& getType() const throw(); 
     const Provider& getProvider() const throw(); 
    }; 
} 
    } 

    #endif 

    #endif 

Scusate tanto di codice.

+0

Stai cercando di aggiungere la libreria Beecrypt alla tua 'soluzione' come un separato' progetto'? –

+0

Potrebbe essere, non so cosa intendi esattamente. –

+0

Ma se hai esperienza con successo nell'aggiungere Beecrypt a una soluzione, allora ho un disperato bisogno del tuo consiglio. Se parli russo (suppongo che sia con il tuo nome), forse sarebbe più conveniente usare il russo? –

risposta

11

Hai dimenticato di includere stdafx.h nella tua fonte (come non riesco a vedere il tuo codice). Se non l'hai fatto, quindi assicurarsi #include "stdafx.h" è la prima linea nel file .cpp, altrimenti si vedrà lo stesso errore anche se hai inserito "stdafx.h" nel file sorgente (ma non nel molto inizio del file).

+0

Quando ho fatto la prima riga non sono riuscito a includere "beecrypt/C++/security/SecureRandom.h". Mi dice che non esiste un file o una directory di questo tipo –

+2

@AndreyChernukha Questo è un problema separato, tuttavia, che non verrà risolto omettendo '#include '! Il compilatore non fa nulla con il tuo codice fino a quando non ha trovato questa intestazione. Non è andato a cercare la tua intestazione. Se non vuoi includere '' devi disattivare le intestazioni precompilate. –

+0

Come posso essere in grado di aprire quel file ("beecrypt/C++/security/SecureRandom.h") nel mio file main.cpp ma non in SecureRandom.cxx? –

5

La riga #include "stdafx.h"deve essere essere la prima riga nella parte superiore di ogni file di origine, prima che vengano inclusi eventuali altri file di intestazione.

Se quello che hai mostrato è l'intero file .cxx, allora si fatto dimentica di includere stdafx.h in quel file.

99

Goto SolutionExplorer (dovrebbe essere già visibile, se non utilizzare il menu: Visualizza-> SolutionExplorer).

Trova il file .cxx nell'albero delle soluzioni, fai clic con il pulsante destro del mouse e scegli "Proprietà" dal menu popup. Otterrai una finestra con le proprietà del tuo file.

Utilizzando l'albero sul lato sinistro, andare alla sezione "Intestazioni C++/precompilate". Sul lato destro della finestra otterrai tre proprietà. Imposta la proprietà denominata "Crea/Usa intestazione precompilata" sul valore di "Non utilizzare intestazioni precompilate".

+4

Questa risposta ha risolto il problema –

+0

Stavo seguendo [Procedura dettagliata: creazione e utilizzo di una libreria di collegamento dinamico (C++)] (http://msdn.microsoft.com/en-us/library/ms235636.aspx) e ho letto erroneamente " deselezionare la casella di controllo dell'intestazione precompilata "come" selezionare la casella di controllo dell'intestazione precompilata "! Doh. – dumbledad

+2

Ho pensato che fosse un'impostazione per l'intero progetto e non mi ero reso conto che i singoli file possono avere diverse opzioni di intestazioni precompilate. Funzionava, grazie! – kjhf

2

Ho riscontrato questo errore quando ho dimenticato di deselezionare l'intestazione precompilata dalle opzioni aggiuntive nella procedura guidata dopo aver nominato una nuova applicazione console Win32.

Perché non ho bisogno di biblioteca stdafx.h, ho rimosso andando a Progetto menù, quindi fare clic su Proprietà o [nome del nostro progetto] Proprietà o semplicemente premere Alt + F7. Nell'elenco a discesa accanto alla configurazione, selezionare Tutte le configurazioni. Sotto questo, è un nodo dell'albero, fare clic su Proprietà di configurazione , quindi su C/C++. Nel riquadro di destra, selezionare Creare/utilizzare l'intestazione precompilata e scegliere Non utilizzare l'intestazione precompilata.

5

Ho anche ricevuto questo errore, ma per un file .h.La soluzione era quella di andare nel file Properties (tramite il menu popup del file Solution Explorer) e impostare correttamente il tipo di file. Era impostato su C/C++ Compiler anziché sul corretto C/C++ header.

+0

Ho avuto lo stesso problema e la soluzione è stata risolta !, Penso che accada quando crei un file .cpp e poi lo rinomini in un file di intestazione. – Rachmaninoff

1

Cambiare la piattaforma del progetto C++ in "x64" (o qualsiasi piattaforma a cui si sta mirando) anziché "Win32". Questo può essere trovato in Visual Studio sotto Build -> Configuration Manager. Trova il tuo progetto nell'elenco e modifica la colonna Piattaforma. Non dimenticare di farlo per tutte le configurazioni della soluzione.

5

Se non si utilizzano intestazioni precompilate nel progetto, impostare la proprietà Crea/Utilizza intestazione precompilata dei file di origine su Non utilizzare intestazioni precompilate. Per impostare questa opzione del compilatore, attenersi alla seguente procedura:

  • Nel riquadro Esplora soluzioni del progetto, fare clic destro sul nome del progetto, e quindi fare clic su Properties.
  • Nel riquadro di sinistra, fare clic sulla cartella C/C++.
  • Fare clic sul nodo Precompiled Headers.
  • Nel riquadro destro, fare clic su Create/Use Precompiled Header e quindi fare clic su Not Using Precompiled Headers.