Gcc 构建加密&x2B+;5.6.2使用Cygwin x86_64

Gcc 构建加密&x2B+;5.6.2使用Cygwin x86_64,gcc,compiler-errors,cygwin,x86-64,crypto++,Gcc,Compiler Errors,Cygwin,X86 64,Crypto++,我正在尝试用Cygwin x86_64构建CryptoPP,但在使用osrng.cpp时遇到了一些问题 我使用的是GCC的C++编译器,在中,我得到以下错误 我以前已经在32位版本的Cygwin下成功编译了整个程序 对于64位版本,如何修复此问题 编辑根据的建议,我在中用if替换了if-defined(\u WIN64)if-defined(\u x86\u 64)。 遗憾的是,我立即遇到了下一个问题,错误如下: $ make g++ -DNDEBUG -g -O2 -march=native

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

我使用的是GCC的C++编译器,在

中,我得到以下错误 我以前已经在32位版本的Cygwin下成功编译了整个程序

对于64位版本,如何修复此问题

编辑根据的建议,我在中用
if
替换了
if-defined(\u WIN64)if-defined(\u x86\u 64)
。 遗憾的是,我立即遇到了下一个问题,错误如下:

$ 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
$make
g++-DNDEBUG-g-O2-march=native-pipe-c fipstest.cpp
在dll.h:30:0中包含的文件中,
来自fipstest.cpp:8:
osrng.h:34:19:错误:应为“;”在成员声明末尾
typedef unsigned _int64提供程序句柄;//输入HCRYPTPROV,避免#包括
^
osrng.h:34:27:错误:“ProviderHandle”未命名类型
typedef unsigned _int64提供程序句柄;//输入HCRYPTPROV,避免#包括
^
osrng.h:38:2:错误:“ProviderHandle”未命名类型
ProviderHandle GetProviderHandle()常量{return mhprovider;}
^
osrng.h:40:2:错误:“ProviderHandle”未命名类型
ProviderHandle m_HPProvider;
^
GNUmakefile:208:目标'fipstest.o'的配方失败
make:**[fipstest.o]错误1

谢天谢地,GCC错误消息在最近的版本中有了显著的改进。
{aka}
s告诉您
long
long-long
之间不匹配。请记住,Win64是LLP64:
long
仍然只有32位,您需要一个
long
来匹配指针的大小。大多数(所有?)其他64位平台都是LP64,这意味着
long
匹配指针的大小

在这种特殊情况下,请参阅中的
(如果已定义)(\u WIN64)
;如果已定义,则需要将该条件更改为
(\uuuux86\u64\uuuu)


您可能也会遇到
\uuu int64
类型的问题。将其替换为
long
。(发生和。)

您可能还会发现
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

(对这里的评论感到抱歉。它太bing了,无法放入小评论块)。

我尝试了,但现在遇到了下一个错误。我已相应地更新了问题。将
\u int64
s替换为
long
。您可能还需要在代码的其他地方进行类似的更改
grep-r\u WIN64
应该可以帮助您找到其他可能的案例。这就成功了。我发布了一个编辑,将你最后的评论包括在答案中。
#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