42

Tôi hy vọng bạn có thể giúp tôi, vì tôi không biết gì về những gì đang xảy ra. Tôi gặp lỗi sau khi cố gắng thêm thư viện Beecrypt vào dự án của mình:Lỗi kết thúc bất ngờ của tập tin

lỗi nghiêm trọng C1010: kết thúc tệp bất ngờ trong khi tìm tiêu đề được biên dịch trước. Bạn đã quên thêm '#include' stdafx.h "'vào nguồn của mình chưa?

Thực ra tôi không quên thêm #include "stdafx" vào nguồn của mình. Những điểm biên dịch lỗi là ở phần cuối của tập tin .cxx này:

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

và đây là 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 

Xin lỗi vì rất nhiều mã.

+0

Bạn đang cố gắng thêm thư viện Beecrypt vào 'giải pháp' của bạn dưới dạng một' dự án riêng biệt'? –

+0

Có thể, tôi không biết chính xác bạn muốn nói gì. –

+0

Nhưng nếu bạn có kinh nghiệm thành công khi thêm Beecrypt vào một giải pháp thì tôi rất cần lời khuyên của bạn. Nếu bạn nói tiếng Nga (tôi giả sử nó bằng tên của bạn) - có thể sẽ thuận tiện hơn khi sử dụng tiếng Nga? –

Trả lời

11

Bạn đã quên bao gồm stdafx.h trong nguồn của mình (vì tôi không thể thấy mã của bạn). Nếu không, hãy đảm bảo #include "stdafx.h"dòng đầu tiên trong tệp .cpp của bạn, nếu không bạn sẽ thấy cùng một lỗi ngay cả khi bạn đã bao gồm "stdafx.h" trong tệp nguồn của mình (nhưng không phải trong số bắt đầu của tập tin).

+0

Khi tôi thực hiện nó FIRST dòng tôi đã trở thành không thể bao gồm "beecrypt/C++/security/SecureRandom.h". Nó nói với tôi rằng không có tập tin hoặc thư mục như vậy –

+2

@AndreyChernukha Đó là một vấn đề riêng biệt, tuy nhiên, nó sẽ không được sửa bằng cách bỏ qua '#include '! Trình biên dịch không làm bất cứ điều gì với mã của bạn cho đến khi nó đã tìm thấy tiêu đề này. Nó không đi tìm tiêu đề của bạn. Nếu bạn không muốn bao gồm '', bạn cần phải tắt các tiêu đề được biên dịch trước. –

+0

Làm cách nào để tôi có thể mở tệp ("beecrypt/C++/security/SecureRandom.h") trong tệp main.cpp của mình nhưng không có trong SecureRandom.cxx? –

5

Dòng #include "stdafx.h"phải là dòng đầu tiên ở đầu mỗi tệp nguồn, trước khi có bất kỳ tệp tiêu đề nào khác được bao gồm.

Nếu nội dung bạn hiển thị là toàn bộ tệp .cxx thì bạn đã làm quên bao gồm stdafx.h trong tệp đó.

99

Giải pháp GotoExplorer (nên được hiển thị, nếu không sử dụng menu: Xem-> SolutionExplorer).

Tìm tệp .cxx của bạn trong cây giải pháp, nhấp chuột phải vào nó và chọn "Thuộc tính" từ trình đơn bật lên. Bạn sẽ nhận được cửa sổ với các thuộc tính của tệp.

Sử dụng cây ở bên trái chuyển đến phần "C++/Biên dịch trước". Ở bên phải của cửa sổ, bạn sẽ nhận được ba thuộc tính. Đặt thuộc tính có tên "Tạo/Sử dụng Đầu trang Biên dịch trước" thành giá trị "Không Sử dụng các Tiêu đề Biên dịch sẵn".

+4

Câu trả lời này đã giải quyết được sự cố –

+0

Tôi đang theo dõi [Hướng dẫn: Tạo và Sử dụng Thư viện Liên kết Động (C++)] (http://msdn.microsoft.com/en-us/library/ms235636.aspx) và đã đọc sai " bỏ chọn hộp kiểm Chuẩn bị biên dịch trước "as" đánh dấu vào hộp kiểm tra tiêu đề Precompiled "! Doh. – dumbledad

+2

Tôi nghĩ rằng đó là một cài đặt cho toàn bộ dự án và không nhận ra rằng các tệp riêng lẻ có thể có các tùy chọn Đầu trang được biên dịch khác nhau. Điều này làm việc, cảm ơn! – kjhf

2

Tôi gặp phải lỗi đó khi tôi quên bỏ chọn tiêu đề Precompiled từ các tùy chọn bổ sung trong trình hướng dẫn sau khi đặt tên ứng dụng bảng điều khiển Win32 mới.

Bởi vì tôi không cần thư viện stdafx.h, tôi loại bỏ nó bằng cách vào Dự án menu, sau đó nhấp vào Thuộc tính hoặc [tên của chúng tôi dự án] Thuộc tính hoặc chỉ cần nhấn Alt + F7 . Trên danh sách thả xuống bên cạnh cấu hình, chọn Tất cả cấu hình. Bên dưới đó, là nút cây, nhấp vào Thuộc tính cấu hình, sau đó C/C++. Trên ngăn bên phải, chọn Tạo/Sử dụng Đầu trang được Biên dịch trước và chọn Không sử dụng Đầu trang được biên dịch trước.

5

Tôi cũng gặp lỗi này, nhưng đối với tệp .h.Bản sửa lỗi là để đi vào tập tin Properties (thông qua trình đơn bật lên tập tin của Solution Explorer) và đặt đúng loại tệp. Nó được đặt thành C/C++ Compiler thay vì chính xác C/C++ header.

+0

Tôi đã có cùng một vấn đề và giải pháp của bạn giải quyết nó !, Tôi nghĩ rằng nó sẽ xảy ra khi bạn tạo một tập tin .cpp và sau đó đổi tên nó thành một tập tin tiêu đề .. – Rachmaninoff

1

Thay đổi Nền tảng của dự án C++ thành "x64" (hoặc bất kỳ nền tảng nào bạn đang nhắm mục tiêu) thay vì "Win32". Điều này có thể được tìm thấy trong Visual Studio dưới Build -> Configuration Manager. Tìm dự án của bạn trong danh sách và thay đổi cột Nền tảng. Đừng quên làm điều này cho tất cả các cấu hình giải pháp.

5

Nếu bạn không sử dụng các tiêu đề được biên dịch trước trong dự án của mình, hãy đặt thuộc tính Đầu trang Tạo/Sử dụng Biên dịch sẵn của tệp nguồn thành Không Sử dụng Tiêu đề Biên dịch sẵn. Để đặt tùy chọn trình biên dịch này, hãy làm theo các bước sau:

  • Trong cửa sổ Solution Explorer của dự án, bấm chuột phải vào tên dự án, sau đó bấm Properties.
  • Trong ngăn bên trái, nhấp vào thư mục C/C++.
  • Nhấp vào nút Precompiled Headers.
  • Trong ngăn bên phải, hãy bấm Create/Use Precompiled Header, rồi bấm Not Using Precompiled Headers.
Các vấn đề liên quan