42

Надеюсь, вы можете мне помочь, потому что я понятия не имею, что происходит. У меня возникла следующая ошибка при попытке добавить библиотеку 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; 
    } 

и вот час файла:

#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 

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

+0

Вы пытаетесь добавить библиотеку Beecrypt в свое 'решение' как отдельный« проект »? –

+0

Может быть, я не знаю, что именно вы имеете в виду. –

+0

Но если у вас есть опыт успешного добавления Beecrypt в решение, то мне отчаянно нужен ваш совет. Если вы говорите по-русски (я полагаю, это по вашему имени) - может быть, было бы удобнее использовать русский язык? –

ответ

11

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

+0

Когда я сделал это FIRST line, я не смог включить «beecrypt/C++/security/SecureRandom.h». Он говорит мне, что такого файла или каталога нет. –

+2

@AndreyChernukha. Это отдельная проблема, которая не будет исправлена ​​путем исключения # #include '! Компилятор ничего не делает с вашим кодом, пока не найдет этот заголовок. Он не искал ваш заголовок. Если вы не хотите включать '', вам нужно отключить предварительно скомпилированные заголовки. –

+0

Как может быть, что я могу открыть этот файл (beecrypt/C++/security/SecureRandom.h) в моем файле main.cpp, но не в SecureRandom.cxx? –

5

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

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

99

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

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

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

+4

Этот ответ решил проблему –

+0

Я читал [Пошаговое руководство: создание и использование библиотеки динамических ссылок (C++)] (http://msdn.microsoft.com/en-us/library/ms235636.aspx) и неправильно интерпретировал " снимите флажок Precompiled header «как» установите флажок Precompiled header »! Doh. – dumbledad

+2

Я думал, что это была настройка для всего проекта, и не понимал, что отдельные файлы могут иметь разные опции Precompiled Headers. Это сработало, спасибо! – kjhf

2

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

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

5

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

+0

У меня была такая же проблема, и ваше решение решило ее !, Я думаю, что это происходит, когда вы создаете .cpp-файл и затем переименовываете его в файл заголовка. – Rachmaninoff

1

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

5

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

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