Forum: Compiler & IDEs g++, OpenSSL Linker meckert


von Joachim D. (Firma: JDCC) (scheppertreiber)


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 ?

von Waldfee (Gast)


Lesenswert?

Moin,

sieht für mich spontan so aus, dass in der csmtp.cpp die Headerdatei für 
die SSL Funktionen fehlt. Vllt. findet er auch den Pfad nicht zu der 
Datei.

Gruß
Waldfee

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Merci Waldfee,

ich cstmp,cpp finde ich

#include "openssl\ssl.h"

von Dr. Sommer (Gast)


Lesenswert?

Waldfee schrieb:
> Headerdatei für die SSL Funktionen fehlt.

Nein. Das ist ein Linker Error.

Joachim D. schrieb:
> include "openssl\ssl.h"

Bitte / statt \ nutzen. Geht auch und erspart Ärger beim Portieren.

Unter Linux ist dieses Library Gedöns deutlich einfacher, ist für den 
Einstieg vielleicht besser.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Dr. Sommer schrieb:
> Bitte / statt \ nutzen. Geht auch und erspart Ärger beim Portieren.

Geht auch gemischt ;)

Der Quellcode ist nicht von mir. Wir wollen mittelfristig in der
Firma auf Linux wechseln, deshalb auch GNU.

von Dr. Sommer (Gast)


Lesenswert?

Joachim D. schrieb:
> Geht auch gemischt ;)

Ohgott...

Joachim D. schrieb:
> Wir wollen mittelfristig in der
> Firma auf Linux wechseln,

Ja dann gleich richtig machen und vorsorgen! Ein / statt \ zu tippen ist 
auch nicht so der gigantische Aufwand. Zum Einstieg kannst du ja mit 
Linux experimentieren... wenn's funktioniert kannst du dir dann den Spaß 
mit Windows antun.

von Jim M. (turboj)


Lesenswert?

Hui. Wir sind bei OpenSSL 1.1.x, die 0.9.x sind hoffnungslos veraltet.

In Deiner Linker Kommandozeile sehe ich das Verzeichnis aber nicht die 
ssleay32.lib oder crypto32.lib Dateien. Du musst dem Linker schon sagen 
welche Libs er mit einlinken soll.

von Joachim D. (Firma: JDCC) (scheppertreiber)


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\libeay32.lib 
-Lopenssl-0.9.8l\out32\ssleay32.lib 2>err.txt

Gleiches Ergebnis. Eigentlich soll doch -L win Verzeichnis einbinden ?

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Mit kleinem 'l':

c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/ld.exe: 
cannot find -lopenssl-0.9.8l\out32\libeay32.lib
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../../mingw32/bin/ld.exe: 
cannot find -lopenssl-0.9.8l\out32\ssleay32.lib
collect2.exe: error: ld returned 1 exit status

von Dr. Sommer (Gast)


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.

von Oliver S. (oliverso)


Lesenswert?

Joachim D. schrieb:
> cannot find -lopenssl-0.9.8l\out32\libeay32.lib

Je nun, cannot find bedeutet schlicht und einfach cannot find. Warum, 
musst du ergründen.

Oliver

von Joachim D. (Firma: JDCC) (scheppertreiber)


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 ;)

von Dr. Sommer (Gast)


Lesenswert?

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.

von Dr. Sommer (Gast)


Lesenswert?

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

Diese Library lässt sich vermutlich nur mit MSVC nutzen.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Dr. Sommer schrieb:
> Joachim D. schrieb:
>> openssl-0.9.8l\out32/ssleay32.lib(tmp32/ssl_ciph.obj):(.text[_ssl_cipher
>> _get_evp]+0x6):  undefined reference to `_chkstk'
>
> Diese Library lässt sich vermutlich nur mit MSVC nutzen.

Möglich. In dem Paket ist eine CSmtp.vcproj

von Joachim D. (Firma: JDCC) (scheppertreiber)


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

von Dr. Sommer (Gast)


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).

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Der Code sieht mir auch nach MS aus, zB:

#pragma comment(lib, "ssleay32.lib")
#pragma comment(lib, "libeay32.lib")

im Quellcode. Soweit ich das sehe, berücksichtigt g++ das eh nicht,

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Soderle, gelinkt hat er das jetzt.

Ich habe von https://wiki.openssl.org/index.php/Binaries
fertige DLLs geladen (https://indy.fulgan.com/SSL/) und die
anstelle der .lib dazugebaut. Keine Fehler mehr.

Nur: "Das Programm kann nicht gestartet werden, da LIBEAY32.dll
auf dem Computer fehlt ..." ;)

Kriegen wir auch noch ;)

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Es läuft ! "Error: Bad Login or Password". Danke noch mal
an alle !

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Es funktioniert jetzt alles ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.