Gcc 构建加密&x2B+;5.6.2使用Cygwin x86_64
我正在尝试用Cygwin x86_64构建CryptoPP,但在使用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
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