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.
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 ?
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
-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
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 ;)
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 ;)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.