Собираем версию 1.1.1 (2018г.)

Понятно сначала скачиваем исходники для Windows, в последней версии (2021г.) каталог имеет название openssl-1.1.1k.

Читаем файл NOTES.WIN, INSTALL , ... (там все прописано как устанавливать).

Динамическая сборка исходников [ /MD ]

То есть на выходе будут файлы *.dll .


@set path=D:PROGNASM;%PATH%
call "C:Program Files (x86)Microsoft Visual Studio 10.0VCvcvarsall.bat" x86

:: Если запуск от имени Администратора, то путь меняется на
:: C:WindowsSystem32
cd /d D:OpenSSLopenssl-1.1.1k
cd	

perl Configure VC-WIN32 --prefix=d:OpenSSL1_1_1_dll 
::--openssldir D:OpenSSLconfig
pause
nmake
pause
nmake test
pause
nmake install

Примечание : мы собираем x86 версию библиотек , так как будем использовать в 32 разрядной программе. И собираем динамически ( cl.exe ... ключ /MD).

Далее рекомендуется запускать батник от имени Администратора, так как по умолчанию в инсталляции присутствуют пути , для работы с которыми нужны права администратора:


PREFIX:      %ProgramFiles(x86)%OpenSSL
OPENSSLDIR:  %CommonProgramFiles(x86)%SSL

Но мы можем их переопределить , у нас так :
--prefix=d:OpenSSL1_1_1_dll

И кстати , если указан параметр --prefix , то по умолчанию --openssldir будет -prefix/ssl

И в нашем случае от Администратора программу запускать не надо будет.

Примечание : В openssldir будет например хранится файл openssl.cfg с настройками по умолчанию для выпуска ключей.

Процесс сборка/тест/установка идет кстати примерно минут 30-40... И в самом конце (на этапе nmake install) получаем ошибку :

*** Installing runtime programs
Copying: apps//openssl.exe to D:/OpenSSL/1_1_1_dll/bin/openssl.exe
Copying: apps//openssl.pdb to D:/OpenSSL/1_1_1_dll/bin/openssl.pdb
Copying: ./tools/c_rehash.pl to D:/OpenSSL/1_1_1_dll/bin/c_rehash.pl
Cannot create directory C:/Program Files (x86)/Common Files/SSL/certs: No such file or directory
NMAKE : fatal error U1077: 'D:PROGStrawberryperlinperl.exe' : return code '0x2'
Stop.

Можно запустить такой батник ниже и посмотреть какие настройки сборки были:
perl configdata.pm --dump . Но запускать его надо непосредственно в том же батнике, где и возникает ошибка.

Также поможет для понимания , что результатом выполнения perl Configure является файл "всем известный" makefile , который лежит в той же директории.

Вот кусочек makefile , где возникает ошибка :

install_programs: install_runtime_libs build_programs
	@if "$(INSTALLTOP)"=="" ( $(ECHO) "INSTALLTOP should not be empty" & exit 1 )
	@$(ECHO) "*** Installing runtime programs"
	@"$(PERL)" "$(SRCDIR)utilmkdir-p.pl" "$(INSTALLTOP)in"
	@"$(PERL)" "$(SRCDIR)utilcopy.pl" $(INSTALL_PROGRAMS) 
                                        "$(INSTALLTOP)in"
	@"$(PERL)" "$(SRCDIR)utilcopy.pl" $(INSTALL_PROGRAMPDBS) 
                                        "$(INSTALLTOP)in"
	@"$(PERL)" "$(SRCDIR)utilcopy.pl" $(BIN_SCRIPTS) 
                                        "$(INSTALLTOP)in"   !!!!! здесь !!!!

Можно конечно раскрутить переменную BIN_SCRIPTS , откуда она берется. Но на самом деле , чтобы завершить установку нормально достаточно просто последний этап nmake install запускать от имени Администратора и ВСЕ!...

Еще как вариант поменять в makefile переменные OPENSSLDIR_dev и OPENSSLDIR_dir и не понадобится запускать от Администратора.

Сборка статически [ /MT]

Все как и ранее только меняем строчку :

perl Configure VC-WIN32 no-shared --prefix=d:OpenSSL1_1_1_static

То есть используем ключ : no-shared .
Ключ static не понятно до конца нужен ли?...

Сборка начинается правильно с ключом MT (cl.exe ..... /MT .....)
В этом случае на этапе линковки получаем ошибку :

LINK : warning LNK4098: defaultlib 'MSVCRT' 
conflicts with use of other libs; use /NODEFAULTLIB:library

/NODEFAULTLIB:library надо добавить в makefile к переменной LDFLAGS , у нас так :
LDFLAGS=/NODEFAULTLIB:library /nologo /debug -static

Примечание : на самом деле надо просто дополнительно сначала делать nmake clean, чтобы объектные файлы от старой сборки удалить (выяснилось это позже).

Только после этого не надо уже вызывать perl Configure , надо теперь сразу переходить к этапу make.

Продолжаем сборку статически и получаем очередную ошибку :

        link /NODEFAULTLIB:library /nologo /debug -static /subsystem:console /opt:ref  /NODEFAULTLIB:library /nologo /debug -static /out:appsopenssl.exe @C:UserspAppDataLocalTemp
m5345.tmp
LINK : warning LNK4044: unrecognized option '/static'; ignored
LINK : warning LNK4044: unrecognized option '/static'; ignored
MSVCRT.lib(MSVCR100.dll) : error LNK2005: _free already defined in LIBCMT.lib(free.obj)
MSVCRT.lib(MSVCR100.dll) : error LNK2005: _realloc already defined in LIBCMT.lib(realloc.obj)
MSVCRT.lib(MSVCR100.dll) : error LNK2005: _malloc already defined in LIBCMT.lib(malloc.obj)
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
appsopenssl.exe : fatal error LNK1169: one or more multiply defined symbols found

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

Возможно это связано с тем , что непосредствено до этого этапа мы делали shared вариант сборки.

Примечание: объектные файлы (.obj), а также файлы *.d, *.pbd собираются непосредственно в каталогах исходников , например :
D:/OpenSSL/openssl-1.1.1k/crypto/asn1

Так , что команда nmake clean похоже необходима , если менялись настройки сборки.