使用Cygwin x86_64构建Crypto ++ 5.6.2

时间:2014-02-01 20:47:59

标签: gcc compiler-errors cygwin x86-64 crypto++

我正在尝试使用Cygwin x86_64构建CryptoPP,但我在使用osrng.cpp时遇到了一些问题。

我正在使用gcc的C ++编译器,我在line 50 of osrng.cpp

收到以下错误
$ make
g++ -DNDEBUG -g -O2 -march=native -pipe -c osrng.cpp
osrng.cpp: In constructor ‘CryptoPP::MicrosoftCryptoProvider::MicrosoftCryptoProvider()’:
osrng.cpp:50:80: error: invalid conversion from ‘CryptoPP::MicrosoftCryptoProvider::ProviderHandle* {aka long unsigned int*}’ to ‘HCRYPTPROV* {aka long long unsigned int*}’ [-fpermissive]
  if(!CryptAcquireContext(&m_hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
                                                                                ^
In file included from /usr/include/w32api/windows.h:95:0,
                 from osrng.cpp:19:
/usr/include/w32api/wincrypt.h:646:26: error:   initializing argument 1 of ‘WINBOOL CryptAcquireContextA(HCRYPTPROV*, LPCSTR, LPCSTR, DWORD, DWORD)’ [-fpermissive]
   WINIMPM WINBOOL WINAPI CryptAcquireContextA(HCRYPTPROV *phProv,LPCSTR szContainer,LPCSTR szProvider,DWORD dwProvType,DWORD dwFlags);
                          ^
GNUmakefile:208: recipe for target 'osrng.o' failed
make: *** [osrng.o] Error 1

我之前已经成功编译了Cybit的32位版本。

如何为64位版本修复此问题?

编辑根据@Yakov answer的建议,我在line 30 of osrng.h中将if defined(_WIN64)if defined(__x86_64__)替换为if。 可悲的是,我立即遇到了下一个问题,由以下错误表示:

$ make
g++ -DNDEBUG -g -O2 -march=native -pipe -c fipstest.cpp
In file included from dll.h:30:0,
                 from fipstest.cpp:8:
osrng.h:34:19: error: expected ‘;’ at end of member declaration
  typedef unsigned __int64 ProviderHandle; // type HCRYPTPROV, avoid #include <windows.h>
                   ^
osrng.h:34:27: error: ‘ProviderHandle’ does not name a type
  typedef unsigned __int64 ProviderHandle; // type HCRYPTPROV, avoid #include <windows.h>
                           ^
osrng.h:38:2: error: ‘ProviderHandle’ does not name a type
  ProviderHandle GetProviderHandle() const {return m_hProvider;}
  ^
osrng.h:40:2: error: ‘ProviderHandle’ does not name a type
  ProviderHandle m_hProvider;
  ^
GNUmakefile:208: recipe for target 'fipstest.o' failed
make: *** [fipstest.o] Error 1

2 个答案:

答案 0 :(得分:2)

值得庆幸的是,GCC错误消息在最近的版本中得到了显着改善。 {aka}告诉您longlong long之间存在不匹配。请记住,Win64是LLP64:long仍然只有32位,您需要long long来匹配指针的大小。大多数(所有?)其他64位平台都是LP64,这意味着long匹配指针的大小。

在这种特殊情况下,请参阅osrng.h中的if defined(_WIN64);您需要将该条件更改为if defined(__x86_64__)

您也可能遇到__int64类型的问题。用long long替换那些。 (发生hereherehere。)

答案 1 :(得分:0)

您可能还会发现word64有用。来自Crypto ++的config.h

#if defined(_MSC_VER) || defined(__BORLANDC__)
    typedef unsigned __int64 word64;
    #define W64LIT(x) x##ui64
#else
    typedef unsigned long long word64;
    #define W64LIT(x) x##ULL
#endif

Cygwin也有一些定义。但它们看起来并不有趣。例如:

#ifndef TYPE_OF_SOCKLEN_T
#   if defined(_WIN32) || defined(__CYGWIN__)
#       define TYPE_OF_SOCKLEN_T int
#   else
#       define TYPE_OF_SOCKLEN_T ::socklen_t
#   endif
#endif

#if defined(__CYGWIN__) && defined(PREFER_WINDOWS_STYLE_SOCKETS)
#   define __USE_W32_SOCKETS
#endif

(对此处的评论感到抱歉。它太过于难以适应小评论栏。)