Anwendung kann keine .so finden

Direkte Linux-Programmierung, POSIX
Antworten
Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Anwendung kann keine .so finden

Beitrag von Kmitska » Fr Okt 05, 2012 3:38 pm

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

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Anwendung kann keine .so finden

Beitrag von fat-lobyte » Fr Okt 05, 2012 10:07 pm

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
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Anwendung kann keine .so finden

Beitrag von Kerli » Fr Okt 05, 2012 10:34 pm

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?
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Re: Anwendung kann keine .so finden

Beitrag von Kmitska » Sa Okt 06, 2012 5:46 pm

Habe das nun mit "ln" erledigt. :)
ln -s [so-Verzeichnis] /usr/lib

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Anwendung kann keine .so finden

Beitrag von fat-lobyte » Sa Okt 06, 2012 10:53 pm

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...
Haters gonna hate, potatoes gonna potate.

Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Re: Anwendung kann keine .so finden

Beitrag von Kmitska » So Okt 07, 2012 4:34 pm

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.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Anwendung kann keine .so finden

Beitrag von Xin » Mo Okt 08, 2012 10:38 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Kmitska
Beiträge: 349
Registriert: Fr Sep 23, 2011 8:49 pm
Wohnort: Karlsruhe, Pforzheim

Re: Anwendung kann keine .so finden

Beitrag von Kmitska » Di Okt 09, 2012 8:58 pm

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

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: Anwendung kann keine .so finden

Beitrag von oenone » Mi Okt 17, 2012 12:36 pm

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.

Antworten