Собираем libeay32.lib 1.0.2 под Qt creator

openssl 1.0.2 использует протокол Tlsv1.2 и мы хотим разобраться в исходниках openssl как это реализовано.

Тут речь о том как настроить проект pro для сборки самой библиотеки из исходников в среде Qt Creator. Делать это в принципе не обязательно. То есть это только для общего развития. Так как ssleay32  собирается прекрасно из поставки , главное чтобы настройки сборки (тулчейн) был одинаковый в qt и в openssl.

В исходниках openssl 1.0.2 есть каталог crypto, который содержит всю крипто функциональность. Именно исходники этого каталога создают библиотеку libeay.

eay - Eric Andry Young (создатель этой библиотеки).

Итак мы собрали сначала openssl 1.0.2 штатно под Windows 10-64 с помощью Perl ,подготовили Makefile-ы для всех каталогов openssl с исходниками и собрали сам openssl из командной строки. Все собралось нормально. Получили библиотеку libeay32.dll и ssleay32.dll .

Теперь мы начинаем собирать исходники ssleay.lib под Qt Creator 2.4.1 на Qt 4.8.1.

фотка 1

Примечание: на Windows 10 -64 установили MicroSoft Visual Studio 2010 Ultimate .

Для этого тупо сначала переносим файлы из каталога crypto в новый проект Qt.

В отличии от openssl (с Perl) в Qt creator мы должны использовать qmake для управления проектами.

фотка 2

Файл проекта crypto.pro в итоге получится такой :


TARGET      = libeay32
TEMPLATE    = lib

QT       -= gui

CONFIG  = staticlib   # !!!!! будет lib , а не  dll !!!!

INCLUDEPATH  = $$PWD/.. $$PWD/../ms
DEPENDPATH  = $$PWD/..

DEFINES  = OPENSSL_THREADS DSO_WIN32 OPENSSL_SYSNAME_WIN32 WIN32_LEAN_AND_MEAN L_ENDIAN _CRT_SECURE_NO_DEPRECATE _WINSOCK_DEPRECATED_NO_WARNINGS OPENSSL_USE_APPLINK OPENSSL_NO_RC5 OPENSSL_NO_MD2 OPENSSL_NO_SSL2 OPENSSL_NO_KRB5 OPENSSL_NO_JPAKE OPENSSL_NO_WEAK_SSL_CIPHERS OPENSSL_NO_STATIC_ENGINE OPENSSL_NO_RC5

win32:LIBS  = ws2_32.lib gdi32.lib advapi32.lib crypt32.lib user32.lib

OBJECTS_DIR     = tmp\\obj\\$$out_dir
MOC_DIR         = tmp\\moc\\$$out_dir
RCC_DIR         = tmp\\rcc\\$$out_dir

include(my_windows/my_windows.pri)
include(../ms/ms.pri)
include(aes/aes.pri)
include(asn1/asn1.pri)
include(bf/bf.pri)
include(bio/bio.pri)
include(bn/bn.pri)
include(buffer/buffer.pri)
include(camellia/camellia.pri)
include(cast/cast.pri)
include(cmac/cmac.pri)
include(cms/cms.pri)
include(comp/comp.pri)
include(conf/conf.pri)

include(des/des.pri)
include(dh/dh.pri)
include(dsa/dsa.pri)
include(dso/dso.pri)
include(ec/ec.pri)
include(ecdh/ecdh.pri)
include(ecdsa/ecdsa.pri)
include(engine/engine.pri)

include(evp/evp.pri)
include(hmac/hmac.pri)
include(idea/idea.pri)
#include(jpake/jpake.pri)
include(krb5/krb5.pri)
include(lhash/lhash.pri)
#include(md2/md2.pri)
include(md4/md4.pri)
include(md5/md5.pri)
include(mdc2/mdc2.pri)
include(modes/modes.pri)

include(objects/objects.pri)
include(ocsp/ocsp.pri)
include(pem/pem.pri)
include(pkcs7/pkcs7.pri)
include(pkcs12/pkcs12.pri)
include(pqueue/pqueue.pri)
include(rand/rand.pri)
include(rc2/rc2.pri)
include(rc4/rc4.pri)
#include(rc5/rc5.pri)
include(ripemd/ripemd.pri)
include(rsa/rsa.pri)
include(seed/seed.pri)
include(sha/sha.pri)
include(srp/srp.pri)
#include(store/store.pri) no-store
#include(threads/threads.pri)

include(ts/ts.pri)
include(txt_db/txt_db.pri)
include(ui/ui.pri)
include(whrlpool/whrlpool.pri)
include(x509/x509.pri)
include(x509v3/x509v3.pri)

include(err/err.pri)

HEADERS  = cryptlib.h \
    buildinf.h \
    md32_common.h \
    o_time.h \
    o_str.h \
    o_dir.h \
    crypto.h \
    opensslv.h \
    opensslconf.h \
    ebcdic.h \
    symhacks.h \
    ossl_typ.h \
    ../e_os.h \
    bn_int.h \
    vms_rms.h \
    sparc_arch.h \
    ppc_arch.h \
    fips_err.h \
    constant_time_locl.h \
    arm_arch.h


SOURCES  = cryptlib.c \
    mem.c \
    mem_clr.c \
    mem_dbg.c \
    cversion.c \
    ex_data.c \
    cpt_err.c \
    ebcdic.c \
    uid.c \
    o_time.c \
    o_str.c \
    o_dir.c \
    o_fips.c \
    o_init.c \
    fips_ers.c \
    my_123_my.c \
    getenv.c


include(stack/stack.pri)


win32 {
  RC_FILE      = ../ms/version32.rc
}

win32{
    CONFIG  = embed_manifest_exe
}

В проекте crypto.pro создаем ветки (типа include(rc2/rc2.pri),..) и рассовываем все файлы (c , h , cpp ) в соответствующие каталоги crypto из каталогов openssl .

Начинаем компиляцию. Конечно начинаются ошибки...

Процесс устранения ошибок у нас происходил примерно в таком порядке (решили не исправлять):

INCLUDEPATH = $$PWD/../ххххххх - такие штуки вставляем иногда , где нужно в подпроекты (*.pri будем называть подпроектами).

Убираем 
bf
	- bfs.c 			main
	- bfspeed.c		maim
	- bf_opts.c		sys/time.h
	- bss_rtcp.c 		#include <iodef.h> 

cast
	- casts.cpp		
	- castopts.c		sys/time.h
	- cast_spd.c		sys/time.h

conf/test.c		LHASH main
	- cnf_save.c	LHASH main

des
	- des_opts.c		# include OPENSSL_UNISTD
	- speed.c			# include <sys/times.h>
	- read_pwd.c
	- des.c
evp
	- e_dsa.c
idea
	- idea_spd.c		sys/time.h
		
openssl
	- dtls1.h		winsock.h 
	
- uplink.c	#include "winsock.h"

lhash
	- lh_test.c	LHASH
	
#include(md2/md2.pri)	

rc2
	- rc2speed.c	sys/time.h
rc4
	- rc4speed.c
	- rc4.c			main

rc5 почему-то надо отключить
	- rc5s.cpp		#include <openssl/rc5.h>
	
x509v3
	- v3conf.c	main LHASH

sys/time.h это файлы как я понимаю для unix, у нас под Windows их просто нет (удалили из проекта).

Задолбала вечная проблема с #include <winsock2.h>.

#include <winsock2.h> должен добавляться до windows.h.
Решили так - просто добавили свой личный my1.h / my1.c , и указали компилировать его первым.

#ifndef MY1_H
#define MY1_H

#include <winsock2.h>

#ifdef  _WINSOCK2API_
int foo();
#endif

#endif // MY1_H

Надо всегда winsock2.h в исходниках размещать на чамом верху файла в буквальном смысле.

*******************************
Компиляция завершена!
Линковка пошла!
********************************

main уже определен многократно в подкаталогах
	удаляем файлы с main
bf
	- bftest.c		- main
cast
	- casttest.c
des
	- dess.cpp
	- des3s.cpp
	- rpw.c
	- destest.c	

aes
	- aes_x86core.c
	
dh
	- p1024.c 
	- dhtest.c
	- p512.c
	- p192.c	main
dsa
	- dsatest.c
	- dsagen.c
ec
	- ectest.c
ecdsa
	- ecdsatest.c
engine
	- enginetest.c
evp
	- evp_test.c
	- evp_extra_test.c
hmac
	- hmactest.c
idea
	- ideatest.c
md4
	- md4s.cpp
	- md4test.c
	- md4.c
md5
	- md5s.cpp
	- md5test.c
	- md5.c
mdc2
	- mdc2test.c
pqueue
	- pq_test.c
rand
	- randtest.c		
rc2
	- rc2test.c	
rc4
	- rc4s.cpp	
	- rc4test.c
ripemd
	- rmdtest.c
	- rmd160.c
rsa
	- rsa_test.c
sha
	- shatest.c	
	- sha512t.c
	- sha256t.c
	- sha1test.c
	- sha1.c
	- sha.c
srp
	- srptest.c
whrpool
	- wp_test.c
x509
	- verify_extra_test.c
x509v3	
	- v3_prn.c	
	- v3prin.c
	- v3nametest.c
	- tabtest.c
bn
	- exp.c
	- exptest.c
	- expspeed.c
	- bntest.c
	- bnspeed.c
	- divtest.c
bf	
	- bf_cbc.c 

crypto
	- sparcv9cap.c
	- s390xcap.c
	- ppccap.c
	- o_dir_test.c main
	- constant_time_test.c main
	- armcap.c

ec
	- ecp_nistz256.c

ecdh   (забыли включить папку)
	ecdhtest.c -



*********************************************
И сборка каталога crypto под Qt Creator 2.4.1
на Qt 4.8.1 завершена успешно
(на все дела 2 суток - перенос руками)
*********************************************
Надеюсь оно того стоило...

Что еще помогало : например можно посмотреть как на CMAKE делают сборку здесь :
https://github.com/janbar/openssl-cmake/blob/master/crypto/CMakeLists.txt

Можно смотреть оригинальные Makefile в каталогах openssl. Тоже очень помогает в вопросе какие файлы надо собирать, а какие удрать из сборки (под Windows).

Далее переходим к сборке второй библиотеки ssleay32.lib, но это уже на другой странице сайта .