openssl, compiler findet funktionen nicht
-
hallo allerseits,
nach stunden- und tagelangem suchen wie man einen ssl socket aufbaut, steht der code halbwegs.
das dev-package für openssl ist includiert und die header-dateien verfügbar, jedoch findet der compiler die funktionen nicht, obwohl er an den include direktiven nix auszusetzen hat
bereits bei den basic settings scheitert der compiler:
#include "openssl/bio.h" #include "openssl/ssl.h" #include "openssl/err.h" using namespace std; int main(){ SSL_load_error_strings(); ERR_load_BIO_strings(); OpenSSL_add_all_algorithms(); return 0; }
und liefert folgende fehlermeldung:
g++-4.0 -L/usr/include -otest ./main.o ./main.o: In function `main':../main.cpp:15: undefined reference to `SSL_load_error_strings' :../main.cpp:16: undefined reference to `ERR_load_BIO_strings' :../main.cpp:17: undefined reference to `OPENSSL_add_all_algorithms_noconf' collect2: ld gab 1 als Ende-Status zurück make: *** [test] Fehler 1
ich meine, die headers wurden doch inkludiert, die signaturen der funktionen stehen ebenfalls in den h-files, warum denn "undefined reference" ???
ich bin zwar nich der programmierguru, aber das kommt mir überkomisch vor...hat vielleicht jemand eine idee? ich wäre für jeden tip dankbar
mfg davey
-
Du solltest vielleicht noch die Bibliothek mit -lssl mitlinken - die Header sind nur Interfacebeschreibungen (oder siehst Du die konkrete Implementierung auch in den Headern?)
-
möp,
das wars! vielen, vielen dank!!!zunächst hatte ich versucht im makefile mit -lopenssl "den pfad zu setzen", da im includeverzeichnis die .h-files in dem ordner "../include/openssl" (!) stehen...
dies konnte er nicht finden, weils -lssl heißen muss, ok
aber woher sollt ich das wissen? ich habe in meinem eclipse versucht den pfad mit einzubinden, leider ohne erfolg... wie kann ich denn herausfinden, wie der zugehörige bibliotheksname is??? er scheint ja nicht mit dem verzeichnisnamen übereinzustimmen, obwohl ich das (einfach ma krass gesagt) mir genauso dachte und es in einigen fällen in der tat so ist.
wo steht die verknüpfung "-lssl" zu "/usr/include/openssl", wo die headers ja auch liegen???????
wie kann ich das auflösen? das kann mir ja IMMER WIEDER passieren, dass -l direktive nicht auf name im include verzeichnis verweistmaney, bei java wär sowas net passiert, *heul
mfg davey
-
Du mußt zwischen Headerdateien und der Library unterscheiden.
Header werden vom Compiler benötigt und werden mit #include in den Sourcecode eingefügt. Sie liegen normalerweise im Verzeichnis /usr/include. Fehlt das #include, meckert der Compiler, daß es Funktionen nicht kennt.
Libraries werden vom Linker benötigt. Diese liegen normalerweise unter /usr/lib (oder /usr/lib64 bei vielen 64-Bit-Systemen). Sie haben den Präfix "lib" und den Suffix ".so". Um eine Library zu verwenden, muß sie mit -l ohne Präfix und Suffix angegeben werden. Ein -lssl bewirkt also, daß unter /usr/lib die Bibliothek libssl.so gesucht wird. Fehlt diese Angabe, schlägt der Linker Alarm, daß er undefinierte Referenzen hat, was für Deinem Fall zutrifft.
Tommi
-
Und die Zuordnung, wie die Bibliothek und wie die Header eines Projektes heissen, findet man normalerweise im Manual
-
hi,
vielen dank für eure hilfe, da hab ich ma richtig was zu gelernt...
endlich konnte mir das ma einer einleuchtend erläutern wie das mit dem linker,compiler und den libraries so läuft. anscheinend kann man hier mit einer einzigen frage mehr lernen, als in einer woche programmiervorlesung.
ich hab auch gleich ma "man openssl" eingetippt, aber auch dort is kein verweis zu der bibliothek /usr/lib/libssl.so zu finden. egal, zumindest weiß ich nun, wo diese zu finden sind
mfg davey
-
davey schrieb:
ich hab auch gleich ma "man openssl" eingetippt, aber auch dort is kein verweis zu der bibliothek /usr/lib/libssl.so zu finden.mfg davey
Doch... Unter SEE ALSO steht: ssl(3)
Dann gib mal man 3 ssl ein und erfreu dich einer Menge an Text.