staging.inyokaproject.org

gcc-Fehler: .so-Bibliothek beim Kompilieren von Main.c nicht gefunden

Status: Gelöst | Ubuntu-Version: Ubuntu 22.04 (Jammy Jellyfish)
Antworten |

franzmoll

Anmeldungsdatum:
20. März 2024

Beiträge: 15

Hi,

ich lerne grad gcc und habe zwei c-Skripte geschrieben, wovon eins (meincode.c) als Bibliothek und das andere (main.c) als Programm kompiliert werden soll, das die Bibliothek verwendet. Die Skripte sind trivial. meincode.c deklariert eine Funktion die ein Integer zurückliefert und main.c ruft diese Funkion von extern auf und gibt den Int-Wert via printf aus.

Ich erstelle die Bibliothek wie folgt:

1
gcc -shared -o libmeinebibliothek.so meincode.c

Das ausführbare Programm erstelle ich so:

1
gcc -o myprog main.c -L. -lmeinebibliothek

Beim Kompilieren gibt es keine Probleme. Wenn ich am Ende ./myprog ausführe kommt die Fehlermeldung

1
libmeinebibliothek.so: cannot open shared object file: No such file or directory

Was mache ich falsch?

Vielen Dank schon mal und beste Grüße

Franz

P.S.: Hier noch einige Anweisungen und Meldungen von meiner Konsole:

1
2
3
4
5
6
7
8
9
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ ls
main.c  meincode.c
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ gcc -shared -o libmeinebibliothek.so meincode.c
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ gcc -o myprog main.c -L. -lmeinebibliothek
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ ls
libmeinebibliothek.so  main.c  meincode.c  myprog
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ ./myprog 
./myprog: error while loading shared libraries: libmeinebibliothek.so: cannot open shared object file: No such file or directory
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ 

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14402

franzmoll schrieb:

Ich erstelle die Bibliothek wie folgt:

1
gcc -shared -o libmeinebibliothek.so meincode.c

Das ausführbare Programm erstelle ich so:

1
gcc -o myprog main.c -L. -lmeinebibliothek

Beim Kompilieren gibt es keine Probleme. Wenn ich am Ende ./myprog ausführe kommt die Fehlermeldung

Wo sucht bzw. schaut das ausführbare Programm nach der lib-Datei?

ldd ./myprog

? BTW: Du kannst auch schon beim kompilieren, dem ausführbaren Programm mitgeben wo es während der Laufzeit, die lib-Datei findet.

franzmoll

(Themenstarter)

Anmeldungsdatum:
20. März 2024

Beiträge: 15

lubux schrieb:

Wo sucht bzw. schaut das ausführbare Programm nach der lib-Datei?

ldd ./myprog

? BTW: Du kannst auch schon beim kompilieren, dem ausführbaren Programm mitgeben wo es während der Laufzeit, die lib-Datei findet.

Ich gehe davon aus, dass das ausführbare Programm im lokalen Pfad sucht, solange nichts spezielles angegeben ist. Das habe ich mir zumindest so angelesen. Auch zielten viele Antworten auf meine diesbezüglichen Fragen andernorts darauf ab, ob .so-File und myprog-File im selben Verzeichnis liegen, und wenn nicht, wäre die Fehlermeldung korrekt (klar).

ldd gibt folgendes aus:

1
2
3
4
5
6
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ ldd ./myprog
        linux-vdso.so.1 (0x00007ffe3bd6b000)
        libmeinebibliothek.so => not found
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc6cd5cf000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fc6cd81f000)
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14402

franzmoll schrieb:

Ich gehe davon aus, dass das ausführbare Programm im lokalen Pfad sucht,
ldd gibt folgendes aus:

mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ ldd ./myprog
        linux-vdso.so.1 (0x00007ffe3bd6b000)
        libmeinebibliothek.so => not found
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc6cd5cf000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fc6cd81f000)

OK. Wie sind dann die Ausgaben von:

file ./libmeinebibliothek.so
pwd
ls -la | grep -i myprog

?

EDIT:

Mach mal (temporär) im Verzeichnis in dem sich die lib "linux-vdso.so.1" befindet, einen symlink auf deine lib und teste danach erneut mit ldd und mit ausführen deines progs.

franzmoll

(Themenstarter)

Anmeldungsdatum:
20. März 2024

Beiträge: 15

lubux schrieb:

OK. Wie sind dann die Ausgaben von:

file ./libmeinebibliothek.so
pwd
ls -la | grep -i myprog

?

Hier die Ausgaben:

1
2
3
4
5
6
7
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ file ./libmeinebibliothek.so
./libmeinebibliothek.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=dd7878364a6a6e2edc7eae513fe6bd6ade85cd7a, not stripped
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ pwd
/home/mbr/Projekte/c/meinebibliothek
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ ls -la | grep -i myprog
-rwxrwxr-x  1 mbr mbr 15992 Mär 20 16:49 myprog
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$

Da taucht "dynamically linked" auf. Ich rufe die lib aber statisch auf. Liegt es vielleicht daran? Ich möchte den statischen Aufruf aber beibehalten.

franzmoll

(Themenstarter)

Anmeldungsdatum:
20. März 2024

Beiträge: 15

lubux schrieb:

EDIT:

Mach mal (temporär) im Verzeichnis in dem sich die lib "linux-vdso.so.1" befindet, einen symlink auf deine lib und teste danach erneut mit ldd und mit ausführen deines progs.

Das dauert ein bisschen. Ich lerne nicht nur gcc sondern auch ubuntu. Ich melde mich wieder.

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14402

franzmoll schrieb:

Da taucht "dynamically linked" auf. Ich rufe die lib aber statisch auf. Liegt es vielleicht daran? Ich möchte den statischen Aufruf aber beibehalten.

Möchtest Du evtl. ein binary (myprog) bei dem nur ein Teil der libs dynamisch gelinkt sind und deine lib statisch gelinkt ist? Dann könntest Du deine lib doch auch in den source code deines progs, einbinden/integrieren.

EDIT:

Wie ist jetzt die Ausgabe von:

ldd ./libmeinebibliothek.so

?

franzmoll

(Themenstarter)

Anmeldungsdatum:
20. März 2024

Beiträge: 15

lubux schrieb:

EDIT:

Mach mal (temporär) im Verzeichnis in dem sich die lib "linux-vdso.so.1" befindet, einen symlink auf deine lib und teste danach erneut mit ldd und mit ausführen deines progs.

Ich finde die lib "linux-vdso.so.1" in meinem System nicht, habe also auch kein Verzeichnis. Suche ich falsch?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ sudo find / -name '*linux-vdso.so*' 
find: ‘/proc/2702/task/2702/net’: Das Argument ist ungültig
find: ‘/proc/2702/net’: Das Argument ist ungültig
find: ‘/proc/4617/task/4617/net’: Das Argument ist ungültig
find: ‘/proc/4617/net’: Das Argument ist ungültig
find: ‘/proc/6093/task/6093/net’: Das Argument ist ungültig
find: ‘/proc/6093/net’: Das Argument ist ungültig
find: ‘/run/user/1000/doc’: Keine Berechtigung
find: ‘/run/user/1000/gvfs’: Keine Berechtigung
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ 

franzmoll

(Themenstarter)

Anmeldungsdatum:
20. März 2024

Beiträge: 15

lubux schrieb:

Wie ist jetzt die Ausgabe von:

ldd ./libmeinebibliothek.so

?

ldd ./libmeinebibliothek.so gibt folgendes aus:

1
2
3
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ ldd ./libmeinebibliothek.so
        statically linked
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$

Um das binary myprog geht es mir gar nicht. Ich möchte am Ende eine lib bauen, die verschiedene Dinge für andere Programme bereitstellt. Die müssen nicht mal in C geschrieben sein. Die C-Skripte hier sollen mir zum Trainig dienen, wie man es macht.

Die Test-C-Skripte sehen so aus:

1
2
3
4
5
6
7
// meincode.c
#include <stdio.h>

int getint()
{
    return 42;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// main.c
#include <stdio.h>

extern int getint();

int main() 
{
    int n = getint();    
    printf("Durchschnitt: %d\n", n);

    return 0;
}

Vielleicht ist ja da der Wurm drin!

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14402

franzmoll schrieb:

1
2
3
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ ldd ./libmeinebibliothek.so
        statically linked
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$

Versuch mal mit der ./libmeinebibliothek.a-Datei:

find . -iname '*.a'
-l:llibmeinebibliothek.a
gcc -o myprog main.c -l:llibmeinebibliothek.a

franzmoll

(Themenstarter)

Anmeldungsdatum:
20. März 2024

Beiträge: 15

lubux schrieb:

Versuch mal mit der ./libmeinebibliothek.a-Datei:

find . -iname '*.a'
-l:llibmeinebibliothek.a
gcc -o myprog main.c -l:llibmeinebibliothek.a

Die .a-Datei hab ich aktuell ja nicht. Ich nehme mal an, sie ist einer .so-Datei ähnlich und habe sie entsprechend erstellt. Hier das Ergebnis:

1
2
3
4
5
6
7
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ gcc -shared -o libmeinebibliothek.a meincode.c
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ find . -iname '*.a'
./libmeinebibliothek.a
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ gcc -o myprog main.c -l:llibmeinebibliothek.a
/usr/bin/ld: -l:llibmeinebibliothek.a kann nicht gefunden werden: Datei oder Verzeichnis nicht gefunden
collect2: error: ld returned 1 exit status
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$

franzmoll

(Themenstarter)

Anmeldungsdatum:
20. März 2024

Beiträge: 15

Wenn man den .so-Pfad bei der Ausführung explizit angibt, funktioniert es.

So gehts:

1
2
3
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ LD_LIBRARY_PATH=/home/mbr/Projekte/c/meinebibliothek  ./myprog
Result: 42
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ 

Das kann es aber nicht sein. Bislang war ich es gewohnt, bei solchen Szenarien Bibliothek und ausführbares Programm in einunddasselbe Verzeichnis zu kopieren und dann das Programm zu starten und alles war gut. So möchte ich es auch hier haben.

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14402

franzmoll schrieb:

Das kann es aber nicht sein.

Wie sind jetzt die Ausgaben von:

ldd ./myprog
objdump -x ./myprog | grep -iE 'needed|path'
readelf -d ./myprog | grep -iE 'needed|path'

?

franzmoll

(Themenstarter)

Anmeldungsdatum:
20. März 2024

Beiträge: 15

lubux schrieb:

Wie sind jetzt die Ausgaben von:

ldd ./myprog
objdump -x ./myprog | grep -iE 'needed|path'
readelf -d ./myprog | grep -iE 'needed|path'

?

So schauts aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ ldd ./myprog
        linux-vdso.so.1 (0x00007fff40a04000)
        libmeinebibliothek.so => not found
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1dbe6d8000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f1dbe928000)
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ objdump -x ./myprog | grep -iE 'needed|path'
  NEEDED               libmeinebibliothek.so
  NEEDED               libc.so.6
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$ readelf -d ./myprog | grep -iE 'needed|path'
 0x0000000000000001 (NEEDED)             Gemeinsame Bibliothek [libmeinebibliothek.so]
 0x0000000000000001 (NEEDED)             Gemeinsame Bibliothek [libc.so.6]
mbr@mbr-kcspc:~/Projekte/c/meinebibliothek$

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@franzmoll: Es wird *nicht* automatisch im Verzeichnis des Programms geschaut wenn eine Bibliothek nicht gefunden werden kann. Man kann einen Suchpfad beim Linken angeben in dem dann dynamisch gesucht wird:

bj@s8n:~/tmp/a$ cat meincode.c 
// meincode.c
#include <stdio.h>

int getint()
{
    return 42;
}
bj@s8n:~/tmp/a$ cat main.c 
// main.c
#include <stdio.h>

extern int getint();

int main() 
{
    int n = getint();    
    printf("Durchschnitt: %d\n", n);

    return 0;
}
bj@s8n:~/tmp/a$ gcc -shared -o libmeinebibliothek.so meincode.c
bj@s8n:~/tmp/a$ gcc -W -o myprog main.c -Wl,-rpath=. -L. -lmeinebibliothek
bj@s8n:~/tmp/a$ ./myprog 
Durchschnitt: 42
bj@s8n:~/tmp/a$ # Aaaber:
bj@s8n:~/tmp/a$ cd ..
bj@s8n:~/tmp$ a/myprog 
a/myprog: error while loading shared libraries: libmeinebibliothek.so: cannot open shared object file: No such file or directory
Antworten |