Неожиданный конец ошибки файла
Надеюсь, ты поможешь мне, потому что я понятия не имею, что происходит. У меня возникла следующая ошибка при попытке добавить библиотеку 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
Извините за столько кода.
Ответы
Ответ 1
Перейти к SolutionExplorer (должно быть уже видно, если не использовать меню: View- > SolutionExplorer).
Найдите файл .cxx в дереве решений, щелкните его правой кнопкой мыши и выберите "Свойства" во всплывающем меню. Вы получите окно с вашими свойствами файла.
Используя дерево слева, перейдите в раздел "С++/Precompiled Headers". В правой части окна вы получите три свойства. Задайте свойство с именем "Создать/Использовать предварительно скомпилированный заголовок" на значение "Не использовать предварительно скомпилированные заголовки".
Ответ 2
Вы забыли включить stdafx.h
в свой источник (так как я не вижу его код). Если вы этого не сделали, убедитесь, что #include "stdafx.h"
- это строка первая в вашем .cpp
файле, иначе вы увидите ту же ошибку, даже если вы включили "stdafx.h"
в исходный файл (но не в самом начале файла).
Ответ 3
Если вы не используете предварительно скомпилированные заголовки в своем проекте, установите для параметра "Создать/Использовать прекомпилированный заголовок" исходные файлы "Не использовать предварительно сжатые заголовки". Чтобы установить этот параметр компилятора, выполните следующие действия:
- В панели "Проводник решений" проекта щелкните правой кнопкой мыши имя проекта и выберите
Properties
.
- На левой панели щелкните папку
C/C++
.
- Нажмите
Precompiled Headers
node.
- На правой панели нажмите
Create/Use Precompiled Header
, а затем нажмите Not Using Precompiled Headers
.
Ответ 4
Строка #include "stdafx.h"
должна быть первой строкой в верхней части каждого исходного файла, прежде чем будут включены другие файлы заголовков.
Если вы указали весь файл .cxx
, вы забыли включить stdafx.h
в этот файл.
Ответ 5
Я также получил эту ошибку, но для файла .h
. Исправление заключалось в том, чтобы войти в файл Properties
(через всплывающее меню файла Solution Explorer) и правильно установить тип файла. Он был установлен в C/C++ Compiler
вместо правильного C/C++ header
.
Ответ 6
Я столкнулся с этой ошибкой, когда забыл снять заголовок Precompiled из дополнительных параметров в мастере после именования нового консольного приложения Win32.
Поскольку мне не нужна библиотека stdafx.h, я удалил ее, перейдя в меню Проект, затем нажмите Свойства или [название нашего проекта] Свойства или просто нажмите Alt + F7. В раскрывающемся списке рядом с конфигурацией выберите Все конфигурации. Ниже это дерево node, нажмите Свойства конфигурации, затем C/С++. На правой панели выберите Создать/Использовать предварительно скомпилированный заголовок и выберите Не использовать Precompiled Header.
Ответ 7
Измените платформу вашего проекта на С++ на "x64" (или на какую-либо платформу, на которую вы нацеливаете) вместо "Win32". Это можно найти в Visual Studio в разделе Build → Configuration Manager. Найдите свой проект в списке и измените столбец платформы. Не забудьте сделать это для всех конфигураций решений.