g++, OpenSSL Linker meckert

(Firma: JDCC) #5378080
Lesenswert?

Servus,

ich mache gerade die ersten Gehversuche mit C++ und Gnu.
Beispiel ist 
https://www.codeproject.com/Articles/98355/SMTP-Client-with-SSL-TLS

OS: W7, Gnu 6.3.0 (MinGW)

Um das Teil zu kompilieren und zu linken:

g++ -o cstmp.exe -Iopenssl-0.9.8l\inc32 csmtp.cpp main.cpp base64.cpp 
md5.cpp -lws2_32 -lwsock32  -Lopenssl-0.9.8l\out32 2>err.txt

err.txt:

C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x7635): 
undefined reference to `SSL_read'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x764a): 
undefined reference to `SSL_get_error'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x76fc): 
undefined reference to `SSL_pending'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x7e90): 
undefined reference to `SSL_write'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x7ea5): 
undefined reference to `SSL_get_error'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x7f7d): 
undefined reference to `SSL_library_init'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x7f82): 
undefined reference to `SSL_load_error_strings'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x7f87): 
undefined reference to `SSLv23_client_method'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x7f8f): 
undefined reference to `SSL_CTX_new'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x804f): 
undefined reference to `SSL_new'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x80ca): 
undefined reference to `SSL_set_fd'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x80f6): 
undefined reference to `SSL_ctrl'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x839b): 
undefined reference to `SSL_connect'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x83b9): 
undefined reference to `SSL_get_error'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x848b): 
undefined reference to `SSL_shutdown'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x849c): 
undefined reference to `SSL_free'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x84c7): 
undefined reference to `SSL_CTX_free'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x84e0): 
undefined reference to `ERR_remove_state'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x84e5): 
undefined reference to `ERR_free_strings'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x84ea): 
undefined reference to `EVP_cleanup'
C:\Users\jd\AppData\Local\Temp\cciHl5Zl.o:csmtp.cpp:(.text+0x84ef): 
undefined reference to `CRYPTO_cleanup_all_ex_data'
collect2.exe: error: ld returned 1 exit status

Im Hexdump der Lib in openssl-0.9.8l\out32\ssleay32.lib finde ih zB 
SSL_read

Irgendwas fehlt da noch bzw. habe ich übersehen ...

Bei Google finde ich da auch nichts was weiterhilft. Die Dokumentation 
der Compiler-
und Linkerflags ist auch so eher lala ;)

Hat da vielleicht jemand einen Tip ?
Gast #5378204
Lesenswert?

-L spezifiziert ein Verzeichnis, in dem nach Dateien gesucht wird, die 
per -l angegeben werden. Dateien per -lfoo werden nach dem Schema 
"libfoo.a" in den -L Verzeichnissen gesucht. Wenn man ganze Dateipfade 
angibt ala openssl-0.9.8l\out32\ssleay32.lib darf man -l noch -L nutzen.
(Firma: JDCC) #5378213
Lesenswert?

g++ -o cstmp.exe -Iopenssl-0.9.8l\inc32 csmtp.cpp main.cpp base64.cpp 
md5.cpp -lws2_32 -lwsock32  -Lopenssl-0.9.8l\out32 -lssleay32 -llibeay32 
2>err.txt

ergibt:

openssl-0.9.8l\out32/ssleay32.lib(tmp32/ssl_ciph.obj):(.text[_ssl_cipher 
_get_evp]+0x6):  undefined reference to `_chkstk'
openssl-0.9.8l\out32/ssleay32.lib(tmp32/ssl_ciph.obj):(.text[_ssl_cipher 
_apply_rule]+0x6):  undefined reference to `_chkstk'
openssl-0.9.8l\out32/ssleay32.lib(tmp32/ssl_ciph.obj):(.text[_ssl_cipher 
_process_rulestr]+0x6):  undefined reference to `_chkstk'
openssl-0.9.8l\out32/ssleay32.lib(tmp32/ssl_ciph.obj):(.text[_ssl_create 
_cipher_list]+0x6):  undefined reference to `_chkstk'
openssl-0.9.8l\out32/ssleay32.lib(tmp32/ssl_ciph.obj):(.text[_SSL_CIPHER 
_description]+0x6):  undefined reference to `_chkstk'
openssl-0.9.8l\out32/ssleay32.lib(tmp32/ssl_lib.obj):(.text[_SSL_has_mat 
ching_session_id]+0x6):  more undefined references to `_chkstk' follow
openssl-0.9.8l\out32/ssleay32.lib(tmp32/ssl_lib.obj):(.text[_SSL_has_mat 
ching_session_id]+0xb):  undefined reference to `__security_cookie'

(insgesamt 751 fehlende ;)
(Firma: JDCC) #5378240
Lesenswert?

Dr. Sommer schrieb:
> Oliver S. schrieb:
>> Warum,
>> musst du ergründen.
>
> Weil das -l zu viel ist. i.A. braucht der MinGW-GCC übrigens keine .lib
> Dateien, man kann direkt gegen die DLL linken. Mach doch mal "nm
> openssl-0.9.8l\out32" und schau ob da die benötigten Symbole drin sind.

nm -g openssl-0.0.81\out32\ssleay32.lib

ergibt eine ziemlich große Datei, "SSL_read" ist drin:

Z 10: 00000000 R ??_C@_08DAJNHMMC@SSL_read?$AA@
Z 473:          U _SSL_read
Z 1387: 00000000 T _SSL_read
Z 2109: U _SSL_read
Gast #5378274
Lesenswert?

Joachim D. schrieb:
> ergibt eine ziemlich große Datei, "SSL_read" ist drin:
Der letzte Post

Joachim D. schrieb:
> openssl-0.9.8l\out32/ssleay32.lib(tmp32/ssl_ciph.obj):(.text[_ssl_cipher
> _get_evp]+0x6):  undefined reference to `_chkstk'
legt nahe dass das SSL_read jetzt gefunden wird.

Kompiliere openssl selbst neu mit dem GCC, oder kompiliere dein Programm 
mit MSVC.

Joachim D. schrieb:
> Der Quellcode ist nicht von mir. Wir wollen mittelfristig in der
> Firma auf Linux wechseln, deshalb auch GNU.
Man kann das selbe Programm unter Windows mit MSVC und unter Linux mit 
GCC kompilieren, wenn es sauber geschrieben wurde (d.h. man achtet 
darauf was der C(++)-Standard garantiert, nicht das was GCC/MSVC sonst 
noch erlauben). Man muss nicht unbedingt den GCC unter Windows nutzen; 
MSVC hat da schon gewisse Vorteile (z.B. kleinere .exe-Dateien, 
schnellere Kompilation, Kompatibilität mit mehr Bibliotheken).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren