Seite 1 von 1

Anwendung kann keine .so finden

Verfasst: Fr Okt 05, 2012 3:38 pm
von Kmitska
Hallo Leute,

ich habe ein kleines Programm geschrieben, das nun auf meinem Server laufen soll.
Nun habe ich gemerkt, dass ich das Programm nur mit dem Compiler "ausführen" kann.

Wenn ich in meinem Terminal "./searchserver" eintippe, bekomme ich den folgenden Fehler:
x@x:~/Programming/C++/Projects/searchserver/bin/Release$ ./searchserver
./searchserver: error while loading shared libraries: libmysqlcppconn.so.6: cannot open shared object file: No such file or directory
Das ist eine MySQL Lib., den ich in meinem Programm verwende.

Ich habe u.a. libmysqlcppconn.so.6 in den Pfad von meinem Programm hinzugefügt, um zu schauen, ob es geht: Doch ohne Erfolg.

Wie kann ich mein Programm dazu bringen, diese Datei zu finden?
Danke schonmal im Voraus.

Regards,
Kmitska

Re: Anwendung kann keine .so finden

Verfasst: Fr Okt 05, 2012 10:07 pm
von fat-lobyte
Erstens:

Du kannst versuchen libmysqlcppconn statisch zu linken, wenn sie das unterstützt. Das merkst du daran, dass es irgendwo eine Datei mit dem Namen "libmysqlcppconn.a" gibt.

Wenn das nicht geht, musst du deinem "Dynamischen Linker", das ist ld.so mitteilen wo er nach Bibliotheken suchen soll.
Das geht auf zwei Arten:
1) setze die Umgebungsvariable LD_LIBRARY_PATH zu dem Verzeichnis, wo sich libmysqlcppconn.so.6 befindet:

Code: Alles auswählen

export "LD_LIBRARY_PATH=~/Programming/C++/Projects/searchserver/bin/Release"
Willst du das Verzeichnis permanent hinzufügen, brauchst du Root-Rechte und musst in der Konfiguration das Verzeichnis angeben und anschließend den linker rekonfigurieren:
2)

Code: Alles auswählen

echo '/home/x/Programming/C++/Projects/searchserver/bin/Release' >> /etc/ld.so.conf.d/searchserver
ldconfig

Re: Anwendung kann keine .so finden

Verfasst: Fr Okt 05, 2012 10:34 pm
von Kerli
Kmitska hat geschrieben:Nun habe ich gemerkt, dass ich das Programm nur mit dem Compiler "ausführen" kann.
Wie kann ein Compiler ein Programm ausführen? ;)

Kann es denn sein, dass dein Programm als 64-bit Anwendung kompiliert wird und libmysqlcppconn.so.6 eine 32-bit Bibliothek ist oder umgekehrt?

Re: Anwendung kann keine .so finden

Verfasst: Sa Okt 06, 2012 5:46 pm
von Kmitska
Habe das nun mit "ln" erledigt. :)
ln -s [so-Verzeichnis] /usr/lib

Re: Anwendung kann keine .so finden

Verfasst: Sa Okt 06, 2012 10:53 pm
von fat-lobyte
Kmitska hat geschrieben:Habe das nun mit "ln" erledigt. :)
ln -s [so-Verzeichnis] /usr/lib
Wow, also das ist wirklich keine gute Lösung...
Du erstellst einen symbolischen Link auf das so-Verzeichniß in /usr/lib? Eigentlich hat ein Administrator/Benutzer unter /usr/ nichts verloren, das ist Revier des Paketmanagers. Und wie funktioniert das überhaupt?? Gabs das verzeichnis schon vorher? Was ist, wenn du Multiarch-Pakete installierst, und der Paketmanager auf einmal versucht /usr/lib anzulegen?? Und wenn ja: der linker sucht nur nicht-rekursiv, er sollte das so-Verzeichnis also nicht finden.

Was war denn an der Lösung mit LD_LIBRARY_PATH verkehrt?


Ich habe mich vor einiger Zeit entschieden, dich zu ignorieren, da du konsequent keine Antworten liest und nicht darüber nachdenkst was dir Leute sagen. Ich wollte dir ne Chance geben, aber es sieht so aus als ob das wohl umsonst war.

Das einzige was ich mich Frage ist, warum du überhaupt noch ein Forum brauchst wenn du ja sowieso alles besser weißt...

Re: Anwendung kann keine .so finden

Verfasst: So Okt 07, 2012 4:34 pm
von Kmitska
Ich habe mich vor einiger Zeit entschieden, dich zu ignorieren, da du konsequent keine Antworten liest und nicht darüber nachdenkst was dir Leute sagen. Ich wollte dir ne Chance geben, aber es sieht so aus als ob das wohl umsonst war.

Das einzige was ich mich Frage ist, warum du überhaupt noch ein Forum brauchst wenn du ja sowieso alles besser weißt...
Ich habe Deine Antwort nachdem ich das gefunden habe gelesen und wollte das hier mitteilen.
Auch wenn ich hier was poste versuche ich das Problem zu lösen.

Re: Anwendung kann keine .so finden

Verfasst: Mo Okt 08, 2012 10:38 am
von Xin
Kmitska hat geschrieben:Habe das nun mit "ln" erledigt. :)
ln -s [so-Verzeichnis] /usr/lib
Das ist keine gute Lösung.

Scheinbar fehlt Dir die Angabe des Verzeichnisses mit -L.

Deine Antwort auf fat-lobytes direkte Worte verstehe ich nicht. Allerdings fällt mir nicht auf, dass Dir fat-lobytes Hinweis etwas gesagt hätte.

Re: Anwendung kann keine .so finden

Verfasst: Di Okt 09, 2012 8:58 pm
von Kmitska
1) setze die Umgebungsvariable LD_LIBRARY_PATH zu dem Verzeichnis, wo sich libmysqlcppconn.so.6 befindet:
Ich kann auf meinem System diese Variable nicht finden. Bekomme sogar unter "set |grep LD_" nichts raus.
echo '/home/x/Programming/C++/Projects/searchserver/bin/Release' >> /etc/ld.so.conf.d/searchserver
ldconfig
Dadurch wurde der Fehler nicht besser. :(

Nun ja, probieren wir's mal anderster.
Hier ist erstmal eine kurze Version von meinem Code:

Code: Alles auswählen

#include <iostream>
#include <mysql_connection.h>
#include <mysql_driver.h>
#include <cppconn/statement.h>
using namespace std;
int main()
{
    sql::mysql::MySQL_Driver *driver;
    sql::Connection *con;
    sql::Statement *stmt;
    driver = sql::mysql::get_mysql_driver_instance();
    con = driver->connect("ip","root","pswd");
    stmt = con->createStatement();
    delete stmt;
    delete con;
    return 0;
}
Die shared objects befinden sich alle unter /home/yasin/Programming/c++-connector/lib und darin sind die folgende Bibs. dabei:
(Quelle: http://dev.mysql.com/downloads/connector/cpp/ - Linux ver. .3.glibc2 (x86, 64-bit), Compressed TAR Archive)
- libmysqlcppconn.so
- libmysqlcppconn.so.6
- libmysqlcppconn.so.6.1.1.1
- libmysqlcppconn-static.a

Wie ich die Dateien eingebunden habe: (Unter Code::Blocks - OS: Ubuntu:

Die statische Bib. libmysqlcppconn-static.a befindet sich unter:
settings -> compiler and debugger -> (Reiter) linker settings -> add

Und die libmysqlcppconn.so.6:
Project -> Build options -> (Reiter) linker settings -> add

Re: Anwendung kann keine .so finden

Verfasst: Mi Okt 17, 2012 12:36 pm
von oenone
Kmitska hat geschrieben:
1) setze die Umgebungsvariable LD_LIBRARY_PATH zu dem Verzeichnis, wo sich libmysqlcppconn.so.6 befindet:
Ich kann auf meinem System diese Variable nicht finden. Bekomme sogar unter "set |grep LD_" nichts raus.
Ja, die Variable ist per Default nicht gesetzt.
Kmitska hat geschrieben:Die shared objects befinden sich alle unter /home/yasin/Programming/c++-connector/lib und darin sind die folgende Bibs. dabei:
Dann musst du auch *den* Pfad benutzen und nicht den bin-Pfad.