Неожиданная ошибка конца файла - PullRequest
50 голосов
/ 14 января 2012

Я надеюсь, что вы можете мне помочь, потому что я понятия не имею, что происходит. У меня возникает следующая ошибка при попытке добавить библиотеку Beecrypt в мой проект:

фатальная ошибка C1010: неожиданный конец файла при поиске предварительно скомпилированного заголовка. Вы забыли добавить '#include "stdafx.h" к своему источнику?

На самом деле я не забыл добавить #include "stdafx" в мой источник. Компилятор указывает на ошибку в конце этого файла .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;
  }

и вот файл h:

#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

Извините за столько кода.

Ответы [ 7 ]

121 голосов
/ 16 января 2012

Перейти к SolutionExplorer (должно быть уже видно, если не использовать меню: View-> SolutionExplorer).

Найдите файл .cxx в дереве решений, щелкните его правой кнопкой мыши и выберите «Свойства» во всплывающем окне.меню.Вы получите окно со свойствами вашего файла.

Используя дерево слева, перейдите в раздел «C ++ / Precompiled Headers».В правой части окна вы получите три свойства.Установите для свойства «Создать / использовать предварительно скомпилированный заголовок» значение «Не использовать предварительно скомпилированные заголовки».

11 голосов
/ 15 сентября 2015

Если вы не используете предварительно скомпилированные заголовки в своем проекте, установите для свойства Создать / Использовать предварительно скомпилированные заголовки исходных файлов значение Не использовать предварительно скомпилированные заголовки. Чтобы установить этот параметр компилятора, выполните следующие действия:

  • На панели Solution Explorer проекта щелкните правой кнопкой мыши имя проекта и выберите Properties.
  • На левой панели щелкните папку C/C++.
  • Щелкните по узлу Precompiled Headers.
  • На правой панели нажмите Create/Use Precompiled Header, а затем нажмите Not Using Precompiled Headers.
10 голосов
/ 14 января 2012

Вы забыли включить stdafx.h в свой источник (как я не вижу его в вашем коде).Если вы этого не сделали, убедитесь, что #include "stdafx.h" - это первая строка в вашем файле .cpp, в противном случае вы увидите ту же ошибку, даже если вы включили "stdafx.h" в исходный файлно не в самом начале файла).

6 голосов
/ 17 декабря 2013

Я тоже получил эту ошибку, но для файла .h. Чтобы исправить это, нужно было зайти в файл Properties (через всплывающее меню файлов обозревателя решений) и правильно установить тип файла. Было установлено C/C++ Compiler вместо правильного C/C++ header.

5 голосов
/ 14 января 2012

Строка #include "stdafx.h" должна быть первой строкой вверху каждого исходного файла, прежде чем будут включены какие-либо другие заголовочные файлы.

Если то, что вы показали, является целым.cxx файл, то вы сделали забыли включить stdafx.h в этот файл.

4 голосов
/ 18 октября 2012

Я столкнулся с этой ошибкой, когда забыл снять флажок «Предварительно скомпилированный» из дополнительных параметров мастера после присвоения имени новому консольному приложению Win32.

Поскольку мне не нужна библиотека stdafx.h, я удалил ее, перейдя в меню Проект , затем нажмите Свойства или [название нашего проекта] Свойства или просто нажмите Alt + F7 .В раскрывающемся списке рядом с конфигурацией выберите Все конфигурации .Ниже этого узла дерева нажмите Свойства конфигурации , затем C / C ++ .На правой панели выберите Создать / использовать предварительно скомпилированный заголовок и выберите Не использовать предварительно скомпилированный заголовок .

1 голос
/ 17 февраля 2014

Измените Платформу вашего C ++ проекта на «x64» (или на какую платформу вы нацеливаетесь) вместо «Win32». Это можно найти в Visual Studio под Build -> Configuration Manager. Найдите свой проект в списке и измените столбец Platform. Не забудьте сделать это для всех конфигураций решения.

...