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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Joachim D. (Firma: JDCC) (scheppertreiber)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-3 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Merci Waldfee,

ich cstmp,cpp finde ich

#include "openssl\ssl.h"

von Dr. Sommer (Gast)


Bewertung
1 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
3 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

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


Bewertung
0 lesenswert
nicht lesenswert
Es funktioniert jetzt alles ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.