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 ?
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
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.
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.
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.
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.
-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.
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
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.
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.
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
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
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).
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,
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 ;)
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