Сборка Crypto++ 5.6.2 с помощью Cygwin x86_64

Я пытаюсь собрать CryptoPP с помощью Cygwin x86_64, но у меня возникли проблемы с osrng.cpp.

Я использую компилятор gcc C++ и получаю следующую ошибку по адресу строка 50 из 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

Раньше я успешно скомпилировал все это под 32-битную версию Cygwin.

Как я могу исправить это для 64-битной версии?

ИЗМЕНИТЬ Как было предложено @Yakov ответ, я заменил if defined(_WIN64)if defined(__x86_64__) на if в строка 30 из osrng.h. К сожалению, я сразу же столкнулся со следующей проблемой, на которую указывает следующая ошибка:

$ 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

person derabbink    schedule 01.02.2014    source источник


Ответы (2)


К счастью, сообщения об ошибках GCC значительно улучшились в последних выпусках. {aka} говорят вам о несоответствии между long и long long. Имейте в виду, что Win64 — это LLP64: long по-прежнему только 32-битный, и вам нужен long long, чтобы соответствовать размеру указателя. Большинство (все?) других 64-битных платформ относятся к LP64, что означает, что long соответствует размеру указателя.

В этом конкретном случае см. if defined(_WIN64) в osrng.h< /а>; вместо этого вам нужно будет изменить это условие на if defined(__x86_64__).

Вы также можете столкнуться с проблемами с типом __int64. Замените их на long long. (Происходит здесь, здесь и здесь.)

person Yaakov    schedule 02.02.2014
comment
Я пробовал это, но теперь я сталкиваюсь со следующей ошибкой. Я обновил вопрос соответственно. - person derabbink; 02.02.2014
comment
Замените _int64s на long long. Вам также может понадобиться внести аналогичные изменения в другие части кода; grep -r _WIN64 должен помочь вам найти другие возможные случаи. - person Yaakov; 02.02.2014
comment
Это помогло. Я внес правку, чтобы включить этот ваш последний комментарий в ответ. - person derabbink; 02.02.2014

Вы также можете найти 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

(Извините за комментарий здесь. Он слишком громкий, чтобы поместиться в небольшой блок комментариев).

person jww    schedule 02.02.2014