Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > C/C++: Прочее > Как собрать openssl под все платформы?


Автор: Felan 22.04.20, 22:18
Мое почтение. Сам я не сишник ни разу и от линукса довольно далек. Так что если что, порошу потыкать носом даже в тривиальные вещи.

Есть надобность иметь библиотеки libcrypto.a, libcurl.a и libssl.a, компилированнымм под все платформы. Т.е. arm64-v8a, armeabi, armeabi-v7a, mips, mips64, x86, x86_64.
В налиичии есть armeabi, armeabi-v7a, mips и x86. По большому счету нужны еще шестидесятиразрядные версии. Причем нужные именно со статичской линковкой (как я понимаю), т.е. именно *.a.

Гугл сказал, что это библиотеки по суте есть openssl. Найти готовые бинарники я не смог, и хотел скомпилировать себе свои собственные.

Скачал архив openssl-1.1.1g.tar.gz. Ну и пытался следовать иснтрукциям. Поставил перл и насм без проблем.

Конфигурирование и старт компиляции происходит нормально.

1. perl Configure VC-WIN64A - сработало без проблем
2. nmake - постоянно падает с ошибкой:

Скрытый текст

cl /Zi /Fdossl_static.pdb /Gs0 /GF /Gy /MD /W3 /wd4090 /nologo /O2 /I "." /I "include" -D"L_ENDIAN" -D"OPENSSL_PIC" -D"OPENSSL_CPUID_OBJ" -D"OPENSSL_IA32_SSE2" -D"OPENSSL_BN_ASM_MONT" -D"OPENSSL_BN_ASM_MONT5" -D"OPENSSL_BN_ASM_GF2m" -D"SHA1_ASM" -D"SHA256_ASM" -D"SHA512_ASM" -D"KECCAK1600_ASM" -D"RC4_ASM" -D"MD5_ASM" -D"AES_ASM" -D"VPAES_ASM" -D"BSAES_ASM" -D"GHASH_ASM" -D"ECP_NISTZ256_ASM" -D"X25519_ASM" -D"POLY1305_ASM" -D"OPENSSLDIR=\"C:\\Program Files\\Common Files\\SSL\"" -D"ENGINESDIR=\"C:\\openssltmp\\lib\\engines-1_1\"" -D"OPENSSL_SYS_WIN32" -D"WIN32_LEAN_AND_MEAN" -D"UNICODE" -D"_UNICODE" -D"_CRT_SECURE_NO_DEPRECATE" -D"_WINSOCK_DEPRECATED_NO_WARNINGS" -D"OPENSSL_USE_APPLINK" -D"NDEBUG" /Zs /showIncludes "ssl\t1_trce.c" 2>&1 > ssl\t1_trce.d
cl /Zi /Fdossl_static.pdb /Gs0 /GF /Gy /MD /W3 /wd4090 /nologo /O2 /I "." /I "include" -D"L_ENDIAN" -D"OPENSSL_PIC" -D"OPENSSL_CPUID_OBJ" -D"OPENSSL_IA32_SSE2" -D"OPENSSL_BN_ASM_MONT" -D"OPENSSL_BN_ASM_MONT5" -D"OPENSSL_BN_ASM_GF2m" -D"SHA1_ASM" -D"SHA256_ASM" -D"SHA512_ASM" -D"KECCAK1600_ASM" -D"RC4_ASM" -D"MD5_ASM" -D"AES_ASM" -D"VPAES_ASM" -D"BSAES_ASM" -D"GHASH_ASM" -D"ECP_NISTZ256_ASM" -D"X25519_ASM" -D"POLY1305_ASM" -D"OPENSSLDIR=\"C:\\Program Files\\Common Files\\SSL\"" -D"ENGINESDIR=\"C:\\openssltmp\\lib\\engines-1_1\"" -D"OPENSSL_SYS_WIN32" -D"WIN32_LEAN_AND_MEAN" -D"UNICODE" -D"_UNICODE" -D"_CRT_SECURE_NO_DEPRECATE" -D"_WINSOCK_DEPRECATED_NO_WARNINGS" -D"OPENSSL_USE_APPLINK" -D"NDEBUG" -c /Fossl\tls13_enc.obj "ssl\tls13_enc.c"
tls13_enc.c
ssl\tls13_enc.c(69) : warning C4267: 'function' : conversion from 'size_t' to 'unsigned int', possible loss of data
ssl\tls13_enc.c(91) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
ssl\tls13_enc.c(92) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
ssl\tls13_enc.c(218) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
ssl\tls13_enc.c(219) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
ssl\tls13_enc.c(395) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
ssl\tls13_enc.c(397) : warning C4267: 'function' : conversion from 'size_t' to 'int', possible loss of data
cl /Zi /Fdossl_static.pdb /Gs0 /GF /Gy /MD /W3 /wd4090 /nologo /O2 /I "." /I "include" -D"L_ENDIAN" -D"OPENSSL_PIC" -D"OPENSSL_CPUID_OBJ" -D"OPENSSL_IA32_SSE2" -D"OPENSSL_BN_ASM_MONT" -D"OPENSSL_BN_ASM_MONT5" -D"OPENSSL_BN_ASM_GF2m" -D"SHA1_ASM" -D"SHA256_ASM" -D"SHA512_ASM" -D"KECCAK1600_ASM" -D"RC4_ASM" -D"MD5_ASM" -D"AES_ASM" -D"VPAES_ASM" -D"BSAES_ASM" -D"GHASH_ASM" -D"ECP_NISTZ256_ASM" -D"X25519_ASM" -D"POLY1305_ASM" -D"OPENSSLDIR=\"C:\\Program Files\\Common Files\\SSL\"" -D"ENGINESDIR=\"C:\\openssltmp\\lib\\engines-1_1\"" -D"OPENSSL_SYS_WIN32" -D"WIN32_LEAN_AND_MEAN" -D"UNICODE" -D"_UNICODE" -D"_CRT_SECURE_NO_DEPRECATE" -D"_WINSOCK_DEPRECATED_NO_WARNINGS" -D"OPENSSL_USE_APPLINK" -D"NDEBUG" /Zs /showIncludes "ssl\tls13_enc.c" 2>&1 > ssl\tls13_enc.d
cl /Zi /Fdossl_static.pdb /Gs0 /GF /Gy /MD /W3 /wd4090 /nologo /O2 /I "." /I "include" -D"L_ENDIAN" -D"OPENSSL_PIC" -D"OPENSSL_CPUID_OBJ" -D"OPENSSL_IA32_SSE2" -D"OPENSSL_BN_ASM_MONT" -D"OPENSSL_BN_ASM_MONT5" -D"OPENSSL_BN_ASM_GF2m" -D"SHA1_ASM" -D"SHA256_ASM" -D"SHA512_ASM" -D"KECCAK1600_ASM" -D"RC4_ASM" -D"MD5_ASM" -D"AES_ASM" -D"VPAES_ASM" -D"BSAES_ASM" -D"GHASH_ASM" -D"ECP_NISTZ256_ASM" -D"X25519_ASM" -D"POLY1305_ASM" -D"OPENSSLDIR=\"C:\\Program Files\\Common Files\\SSL\"" -D"ENGINESDIR=\"C:\\openssltmp\\lib\\engines-1_1\"" -D"OPENSSL_SYS_WIN32" -D"WIN32_LEAN_AND_MEAN" -D"UNICODE" -D"_UNICODE" -D"_CRT_SECURE_NO_DEPRECATE" -D"_WINSOCK_DEPRECATED_NO_WARNINGS" -D"OPENSSL_USE_APPLINK" -D"NDEBUG" -c /Fossl\tls_srp.obj "ssl\tls_srp.c"
tls_srp.c
cl /Zi /Fdossl_static.pdb /Gs0 /GF /Gy /MD /W3 /wd4090 /nologo /O2 /I "." /I "include" -D"L_ENDIAN" -D"OPENSSL_PIC" -D"OPENSSL_CPUID_OBJ" -D"OPENSSL_IA32_SSE2" -D"OPENSSL_BN_ASM_MONT" -D"OPENSSL_BN_ASM_MONT5" -D"OPENSSL_BN_ASM_GF2m" -D"SHA1_ASM" -D"SHA256_ASM" -D"SHA512_ASM" -D"KECCAK1600_ASM" -D"RC4_ASM" -D"MD5_ASM" -D"AES_ASM" -D"VPAES_ASM" -D"BSAES_ASM" -D"GHASH_ASM" -D"ECP_NISTZ256_ASM" -D"X25519_ASM" -D"POLY1305_ASM" -D"OPENSSLDIR=\"C:\\Program Files\\Common Files\\SSL\"" -D"ENGINESDIR=\"C:\\openssltmp\\lib\\engines-1_1\"" -D"OPENSSL_SYS_WIN32" -D"WIN32_LEAN_AND_MEAN" -D"UNICODE" -D"_UNICODE" -D"_CRT_SECURE_NO_DEPRECATE" -D"_WINSOCK_DEPRECATED_NO_WARNINGS" -D"OPENSSL_USE_APPLINK" -D"NDEBUG" /Zs /showIncludes "ssl\tls_srp.c" 2>&1 > ssl\tls_srp.d
"C:\perl\strawberry\perl\bin\perl.exe" "util\mkdef.pl" ssl 32 > libssl.def
IF EXIST .manifest DEL /F /Q .manifest
IF EXIST libssl-1_1-x64.dll DEL /F /Q libssl-1_1-x64.dll
link /nologo /debug /dll /nologo /debug /implib:libssl.lib /out:libssl-1_1-x64.dll /def:libssl.def @C:\Users\ANDREI~1\AppData\Local\Temp\nm330.tmp || (DEL /Q libssl-1_1-x64.* libssl.lib && EXIT 1)
LINK : warning LNK4068: /MACHINE not specified; defaulting to X86
ssl\bio_ssl.obj : fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86'
Could Not Find c:\openssl\libssl-1_1-x64.*
NMAKE : fatal error U1077: 'link' : return code '0x1'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\BIN\nmake.exe"' : return code '0x2'
Stop.


Аналогичная ошибка происходит для x86 конфигурации.

Может кто-нибудь научить как ето все заставить работать?

ЗЫЖ Может у кого завалялись готовые бинарники? Был бы очень признателен.

Автор: Wound 23.04.20, 06:32
Если начать анализировать ошибки, то можно увидеть:
Цитата

"C:\perl\strawberry\perl\bin\perl.exe" "util\mkdef.pl" ssl 32 > libssl.def
IF EXIST .manifest DEL /F /Q .manifest
IF EXIST libssl-1_1-x64.dll DEL /F /Q libssl-1_1-x64.dll
link /nologo /debug /dll /nologo /debug /implib:libssl.lib /out:libssl-1_1-x64.dll /def:libssl.def @C:\Users\ANDREI~1\AppData\Local\Temp\nm330.tmp || (DEL /Q libssl-1_1-x64.* libssl.lib && EXIT 1)
LINK : warning LNK4068: /MACHINE not specified; defaulting to X86
ssl\bio_ssl.obj : fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86'
Could Not Find c:\openssl\libssl-1_1-x64.*
NMAKE : fatal error U1077: 'link' : return code '0x1'
Stop.

Т.е. как я понял, перлу ты скормил X64 настройку и он тебе сгенерировал код для компиляции для платформы x64, а при компиляции ты ничего не стал указывать, и по умолчанию линковщик выбрал конфигурацию X86, а так как эти две конфигурации конфликтные для линковщика он выдал тебе вот такую ошибку.
Я думаю тебе нужно перлу указать платформу и когда компилишь указать платформу.
В ошибке даже сам линковщик подсказывает:

Цитата
warning LNK4068: /MACHINE not specified


Думаю именно в этом проблема на данном этапе сборки. :-?

Добавлено
Во, очень интересная статья по данной ошибке: https://github.com/openssl/openssl/issues/5366, возможно поможет.

Добавлено
Вот еще по этой же проблематике: https://github.com/openssl/openssl/issues/4508

Добавлено
Ну и это еще можно почитать: https://stackoverflow.com/questions/3563756...get-machine-typ

Добавлено
Короче народ сходится во мнении что гдето в настройках тулчейнов трабла, либо ты 32 битным тулчейном пытаешься собрать 64 битную либу, либо настройки линкера перепутали.

Я когда то собирал OpenSSL под UNIX особых проблем не испытывал. Под виндой хз, вроде брал уже собранные бинари. :-?

Автор: grgdvo 23.04.20, 07:56
Если речь о Windows + Visual Studio,
то я предлагаю рассмотреть еще альтернативный вариант в виде vcpkg.
Вот отсюда краткое введение - как использовать.
И в этом менеджере пакетов есть openssl достаточно свежей версии, сможете собрать.

Автор: Felan 23.04.20, 13:23
Цитата Wound @
Т.е. как я понял, перлу ты скормил X64 настройку и он тебе сгенерировал код для компиляции для платформы x64, а при компиляции ты ничего не стал указывать, и по умолчанию линковщик выбрал конфигурацию X86, а так как эти две конфигурации конфликтные для линковщика он выдал тебе вот такую ошибку.

Да, вроде конфигурация проходит нормально.

Вообще, я, где-то из общих соображений так и думал. Проблема в том, что я не понимаю, что именно надо делать в таких случаях. Весь гугл облазил, но видимо просто не понимаю, куда смотреть.
В инструкциях написано, что раньше надо было специальные батники запускать, типа do*, но теперь не надо и надо просто make выполнить.

Цитата Wound @
Думаю именно в этом проблема на данном этапе сборки.

Я же запускаю коммандрную строку специально в режиме x64 tools, разве этого не достаточно?
Если я конфигурирую версия для x86, то получаю ошибку о том, что нет библиотеки openssl по заданному пути. (к сожалению нет под рукой конкретного вывода).


Цитата Wound @
Короче народ сходится во мнении что гдето в настройках тулчейнов трабла, либо ты 32 битным тулчейном пытаешься собрать 64 битную либу, либо настройки линкера перепутали

Вот я тоже пришел к такому же выводу, но как бы от этого не легче. Ссылки эти я видел. Проблема в том, что я не понимаю, как это применить в моей ситуации. А что касается последней, так мне вобще не очень понятно. У меня же нет проекта, и в студии я его не открываю. Не, я понимаю, что где-то глубоко в нутри это все та же настройка, но че делать не пойму :(


Цитата Wound @
Я когда то собирал OpenSSL под UNIX особых проблем не испытывал. Под виндой хз, вроде брал уже собранные бинари.

У меня есть линукс mint, попробую на нем собрать сегодня. У меня толкьо вопрос, будут ли потом применимы эти либы (если вдруг сработает) под виндой и андроидом?
Тут только проблема еще в том, что и с линуксом я тоже мало знаком.

Цитата grgdvo @
Если речь о Windows + Visual Studio,
то я предлагаю рассмотреть еще альтернативный вариант в виде vcpkg.
Вот отсюда краткое введение - как использовать.

Ну желательно. Но есть линукс минт. И если есть конкретные работающие шаги/инструкция для нее, то было бы здорово. Особенно если после этого либы будут применимы под виндой и андроидом.
По ссылки почитаю, я привильно поинмаю, что идея в том, что на вигду надо поставить аналаог линуксового менеджера пакетов, стянуть нужные пакеты и собрать их?


И пару общих вопросов, просто что бы быть уверенным, что я правильно понимаю хоть что-то

1. Есть проект ОпенССЛ, он написан на си, и что бы собирать его подразные платформы нужные разные конфигурационные файлы. Но проект идет с универсальными шаблонами этих файлов и перл нужен для того, что бы эти шаблоны превратить в реальные билд скрипты?
2. Расширение *.а, это статически линкующаяся либа в мире юникса, микросфт такие либы делает с расширением *.lib. И в принципе достаточно просто переименовать 'lib' в 'a' и это будет то же самое?

Автор: grgdvo 23.04.20, 21:53
Цитата
По ссылки почитаю, я привильно поинмаю, что идея в том, что на вигду надо поставить аналаог линуксового менеджера пакетов, стянуть нужные пакеты и собрать их?

Да, vcpkg своего рода менеджер пакетов, которые собираются из открытых кодов под заданную арзитектуру.
Если все правильно поставили, то в приниципе достаточно в шеле задать команду что-то типа

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    PS C:\Users\user\source\repos\vcpkg> .\vcpkg.exe install openssl:x64-windows
    Computing installation plan...
    The following packages will be built and installed:
        openssl[core]:x64-windows
      * openssl-windows[core]:x64-windows
    Additional packages (*) will be modified to complete this operation.
    Starting package 1/2: openssl-windows:x64-windows
    Building package openssl-windows[core]:x64-windows...
    -- Downloading http://strawberryperl.com/download/5.30.0.1/strawberry-perl-5.30.0.1-32bit.zip...
    -- Downloading https://www.openssl.org/source/openssl-1.1.1d.tar.gz...
    -- Extracting source C:/Users/user/source/repos/vcpkg/downloads/openssl-1.1.1d.tar.gz
    -- Using source at C:/Users/user/source/repos/vcpkg/buildtrees/openssl-windows/src/openssl-1-b1f8ae3e6c
    -- Downloading http://www.nasm.us/pub/nasm/releasebuilds/2.14.02/win32/nasm-2.14.02-win32.zip...
    -- Downloading http://download.qt.io/official_releases/jom/jom_1_1_3.zip...
    -- Copying openssl release source files...
    -- Copying openssl release source files... done
    -- Configure x64-windows-rel
    -- Configure x64-windows-rel done
    -- Build x64-windows-rel
    -- Build x64-windows-rel done
    -- Copying openssl debug source files...
    -- Copying openssl debug source files... done
    -- Configure x64-windows-dbg
    -- Configure x64-windows-dbg done
    -- Build x64-windows-dbg
    -- Build x64-windows-dbg done
    -- Installing: C:/Users/user/source/repos/vcpkg/packages/openssl-windows_x64-windows/share/openssl-windows/copyright
    -- Performing post-build validation
    -- Performing post-build validation done
    Building package openssl-windows[core]:x64-windows... done
    Installing package openssl-windows[core]:x64-windows...
    Installing package openssl-windows[core]:x64-windows... done
    Elapsed time for package openssl-windows:x64-windows: 31.92 min
    Starting package 2/2: openssl:x64-windows
    Building package openssl[core]:x64-windows...
    -- Installing: C:/Users/user/source/repos/vcpkg/packages/openssl_x64-windows/share/openssl//usage
    -- Performing post-build validation
    -- Performing post-build validation done
    Building package openssl[core]:x64-windows... done
    Installing package openssl[core]:x64-windows...
    Installing package openssl[core]:x64-windows... done
    Elapsed time for package openssl:x64-windows: 560.1 ms
     
    Total elapsed time: 31.93 min
     
    ...skipped ...


подождать какое-то время. менеджер сам подкачает и установит нужны зависимости и доп. пакеты.
по результату вы полчите это

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    libcrypto-1_1-x64.dll
    libssl-1_1-x64.dll
    openssl.cnf
    openssl.exe
    libcrypto.lib
    libssl.lib


уже разложенное по папочкам внутри vcpkg.
останется только подключить к собственному проекту как обычно.
если у вас cmake, то будет предложена интеграция с cmake на уровне find_package.


про perl и остальное нутро openssl не скажу, давно ручками его не собирал.
вероятно да, много наскриптовали, что поддерживать большое количество портов на разные платформы.

Автор: Felan 24.04.20, 15:56
В итогде кажется я просто не туда смотрел. То, что мне было надо, было написано в файле NOTICE.Android. И в принцие это сработоало, но только под линуксом. Не смотря на то, что они говорят, что по идее разницы быть не должно, под виндой на каждом шаге были какие то грабли. Я сдался на то, что нет gcc.

Вобщем плюнул, и попробовал под линуксом. Сработало почти без проблем.

Спасибо за советы и потраченное время.

Автор: JoeUser 24.04.20, 15:58
:good: За отметку "вопрос решен" :)

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)