67

I hope you can help me, cause I have no idea about what's going on. I'm having the following error while trying to add Beecrypt library to my project:

fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source?

Actually I did not forget to add #include "stdafx" to my source. The compiler points the error to be at the end of this .cxx file:

#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;
  }

and here is h 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

Sorry for so much code.

Bo Persson
  • 90,663
  • 31
  • 146
  • 203
Andrey Chernukha
  • 21,488
  • 17
  • 97
  • 161

7 Answers7

148

Goto SolutionExplorer (should be already visible, if not use menu: View->SolutionExplorer).

Find your .cxx file in the solution tree, right click on it and choose "Properties" from the popup menu. You will get window with your file's properties.

Using tree on the left side go to the "C++/Precompiled Headers" section. On the right side of the window you'll get three properties. Set property named "Create/Use Precompiled Header" to the value of "Not Using Precompiled Headers".

Wacek
  • 4,326
  • 2
  • 19
  • 28
  • 2
    I was following the [Walkthrough: Creating and Using a Dynamic Link Library (C++)](http://msdn.microsoft.com/en-us/library/ms235636.aspx) and had misread "clear the Precompiled header check box" as "check the Precompiled header check box"! Doh. – dumbledad Jan 13 '15 at 10:55
  • 2
    I thought it was a setting for the entire project and didn't realise that individual files can have different Precompiled Headers options. This worked, thanks! – Slate Oct 07 '16 at 12:03
  • 3
    But does anyone know why the error occurs, and why this error appears when *stdafx.h* is in fact being included? – Jonathan Wood Dec 10 '16 at 22:53
  • this solved it for me too since I had one .cpp that was using the precompiled header and one .c that was not. – ComradeJoecool Sep 24 '17 at 17:03
  • The hint that evey single file can have its own Precompiled header is nice. However, this is only a workaround in my opinion. – Mohammed Noureldin Apr 11 '19 at 11:54
22

If you do not use precompiled headers in your project, set the Create/Use Precompiled Header property of source files to Not Using Precompiled Headers. To set this compiler option, follow these steps:

  • In the Solution Explorer pane of the project, right-click the project name, and then click Properties.
  • In the left pane, click the C/C++ folder.
  • Click the Precompiled Headers node.
  • In the right pane, click Create/Use Precompiled Header, and then click Not Using Precompiled Headers.
Machavity
  • 30,841
  • 27
  • 92
  • 100
11

You did forget to include stdafx.h in your source (as I cannot see it your code). If you didn't, then make sure #include "stdafx.h" is the first line in your .cpp file, otherwise you will see the same error even if you've included "stdafx.h" in your source file (but not in the very beginning of the file).

Nawaz
  • 353,942
  • 115
  • 666
  • 851
  • When i made it FIRST line i became unable to include "beecrypt/c++/security/SecureRandom.h". It tells me that there's no such file or directory – Andrey Chernukha Jan 14 '12 at 15:03
  • 2
    @AndreyChernukha That is a separate issue, though, which won't be fixed by omitting `#include `! The compiler doesn't do anything with your code until it has found this header. It didn't go looking for your header. If you don't want to include `` you need to turn off precompiled headers. – Dietmar Kühl Jan 14 '12 at 15:07
  • How can it be that i'm able to open that ("beecrypt/c++/security/SecureRandom.h") file in my main.cpp file but not in SecureRandom.cxx? – Andrey Chernukha Jan 14 '12 at 15:09
7

I also got this error, but for a .h file. The fix was to go into the file Properties (via Solution Explorer's file popup menu) and set the file type correctly. It was set to C/C++ Compiler instead of the correct C/C++ header.

jnnnnn
  • 3,889
  • 32
  • 37
  • 2
    I had the same issue and your solution solved it!, I think it happens when you create a .cpp file and then rename it into a header file.. – Rathma Feb 16 '18 at 19:31
  • Thanks to both of you, guys! There is really this issue when you create a .cpp file by mistake and then rename it to .h file. – Roman2452809 Jun 17 '19 at 07:25
6

The line #include "stdafx.h" must be the first line at the top of each source file, before any other header files are included.

If what you've shown is the entire .cxx file, then you did forget to include stdafx.h in that file.

Cody Gray - on strike
  • 239,200
  • 50
  • 490
  • 574
5

I encountered that error when I forgot to uncheck the Precompiled header from the additional options in the wizard after naming a new Win32 console application.

Because I don't need stdafx.h library, I removed it by going to Project menu, then click Properties or [name of our project] Properties or simply press Alt + F7. On the dropdownlist beside configuration, select All Configurations. Below that, is a tree node, click Configuration Properties, then C/C++. On the right pane, select Create/Use Precompiled Header, and choose Not using Precompiled Header.

MiddleKay
  • 319
  • 4
  • 13
4

Change the Platform of your C++ project to "x64" (or whichever platform you are targeting) instead of "Win32". This can be found in Visual Studio under Build -> Configuration Manager. Find your project in the list and change the Platform column. Don't forget to do this for all solution configurations.

JordanBean
  • 1,949
  • 21
  • 28
  • It works, why this works? The other reasonable solutions did not work out, but this one did it and there's no apparent reason or explanation for this, yet. – Rick Oct 20 '19 at 21:19