g++, OpenSSL Linker meckert

OP (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 ?
OP (Firma: JDCC) #5378178
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
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.
OP (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 ;)
OP (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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.