Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
Grundlagen in C lernen - Shared Libraries.
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum
View previous topic :: View next topic  
Author Message
musv
Advocate
Advocate


Joined: 01 Dec 2002
Posts: 3366
Location: de

PostPosted: Fri Jun 25, 2010 10:30 am    Post subject: Grundlagen in C lernen - Shared Libraries. Reply with quote

Hallo,

ich arbeite mich grad etwas in C/C++ ein. Dabei bin ich jetzt an die Stelle mit den Shared Libs gekommen.

Tutorial: http://www.adp-gmbh.ch/cpp/gcc/create_lib.html

Das Problem hab ich beim Einbinden der dynamischen Lib:
Code:
ldd dynamically_linked

zeigt mir die Shared Lib nicht an. Und wenn ich die zuvor statische statische Lib (libmean.a) umbenenn, kann ich die main.c auch nicht mehr compilieren.
Code:
gcc main.c -o dynamisch -L. -lmean
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lmean
collect2: ld gab 1 als Ende-Status zurück


Wo liegt mein Denkfehler?
Back to top
View user's profile Send private message
franzf
Advocate
Advocate


Joined: 29 Mar 2005
Posts: 4565

PostPosted: Fri Jun 25, 2010 1:01 pm    Post subject: Reply with quote

Beim statisch linken ist es jedenfalls ein Lesefehler, kein Denkfehler ;)
Dir fehlt das "static" beim kompilieren und linken des executables.
// edit: Ups
seh grad erst das "umbenenn"; Das geht nicht, dynamisch erstellte lib ist was ganz anderes als nen statische, die kannst du nicht einfach umbenennen und fertig! Merkst du ja schon an den unterschiedlichen Befehlen, die man zum Erstellen braucht :D
//
Was aber mit dem dynamisch linken ist, kann ich nicht genau sagen, da ich faule Sau nie selber Makefiles schreib, sondern die Arbeit an Makefilegeneratoren (vornehmlich cmake) delegiere ;)
Ein wenig spielen hat aber ergeben, dass die unterschiedlichen Angaben in "-soname, libmean.so.1" und tatsächlicher lib "libmean.so.1.0.1" etwas Probleme schafft. Nehm ich die Zeile mit dem "-soname" raus, linkt das Programm, in ldd ist das auch zu sehen. Dummerweise kommt aber dann kein Output mehr...

Hier noch ein kurzes CMakeLists.txt, wenn dich interessiert, wie cmake die ganzen Kommandos ausführen lässt:
Code:
add_library(mean SHARED calc_mean.c)
set_target_properties(mean PROPERTIES VERSION 1.0.1)
add_executable(dynamically main.c)
target_link_libraries(dynamically mean)

Code:
$ cmake .
$ VERBOSE=1 make

da siehst du dann die einzelnen Befehle samt Parametern.
Back to top
View user's profile Send private message
SinoTech
Advocate
Advocate


Joined: 20 Mar 2004
Posts: 2579
Location: Neunkirchen / Saarland / Germany

PostPosted: Sat Jun 26, 2010 11:48 pm    Post subject: Re: Grundlagen in C lernen - Shared Libraries. Reply with quote

musv wrote:
Hallo,

ich arbeite mich grad etwas in C/C++ ein. Dabei bin ich jetzt an die Stelle mit den Shared Libs gekommen.

Tutorial: http://www.adp-gmbh.ch/cpp/gcc/create_lib.html

Das Problem hab ich beim Einbinden der dynamischen Lib:
Code:
ldd dynamically_linked

zeigt mir die Shared Lib nicht an. Und wenn ich die zuvor statische statische Lib (libmean.a) umbenenn, kann ich die main.c auch nicht mehr compilieren.
Code:
gcc main.c -o dynamisch -L. -lmean
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lmean
collect2: ld gab 1 als Ende-Status zurück


Wo liegt mein Denkfehler?

Das Problem ist ganz einfach das deine Bibliothek eine Versionsnummer am Ende hat. Gibst du dem Compiler das Flag -lmean mit, sucht der Linker erst nach einer Bibliothek "libmean.so" und wenn er die nicht findet nach "libmean.a" (also die statische Variante). Da es die "libmean.so" bei dir nicht gibt, benutzt er die statische Bibliothek. Deshalb taucht die Bibliothek auch nicht in der Ausgabe von ldd auf.

Bei der Option "-Wl,-soname,SO_NAME" musst du ein bisschen aufpassen. Normalerweise probiert dein fertiges Programm beim starten die Bibliotheken zu laden, gegen die es gelinkt wurde. Die Namen der Bibliotheken entsprechen dabei den Dateinamen beim linken. Mit der Option "-Wl,-soname,..." kannst du beim erstellen der shared library einen beliebigen Namen angeben, dieser wird als Attribute in ihr gespeichert. Wenn du gegen diese Bibliothek linkst, ignoriert dein Programm den Dateinamen dieser Bibliothek und benutzt stattdessen den Namen der in diesem Attribut gespeichert ist.

Du hast in dem Tutorial also eigentlich zwei Probleme:

1. Die shared library heißt "libmean.so.1.0.1" statt "libmean.so", der Linker kann sie also nicht finden.
2. Wenn du die shared library umbenennst ist zwar der Linker zufrieden, dein Programm startet aber nicht weil es nach der Bibliothek "libmean.so.1" sucht (der Name wurde über die Option "-Wl,-soname,..." angegeben).

Also entweder zum erstellen der shared library diese Zeile benutzen:
Code:

gcc -shared -o libmean.so  calc_mean.o


oder symbolische Links erstellen so das alle zufrieden sind ;-):
Code:

$ ln -s libmean.so.1.0.1 libmean.so.1
$ ln -s libmean.so.1.0.1 libmean.so

$ ls -l libmean*
-rw-r--r-- 1 sinotech wheel 1598 Jun 27 01:24 libmean.a
lrwxrwxrwx 1 sinotech wheel   16 Jun 27 01:27 libmean.so -> libmean.so.1.0.1
lrwxrwxrwx 1 sinotech wheel   16 Jun 27 01:56 libmean.so.1 -> libmean.so.1.0.1
-rwxr-xr-x 1 sinotech wheel 7849 Jun 27 01:26 libmean.so.1.0.1





Cheers,

Sino
_________________
Help to answer the unanswered
Back to top
View user's profile Send private message
musv
Advocate
Advocate


Joined: 01 Dec 2002
Posts: 3366
Location: de

PostPosted: Mon Jun 28, 2010 9:17 am    Post subject: Reply with quote

Vielen Dank, hab dadurch wieder eine Menge begriffen.
Back to top
View user's profile Send private message
mv
Watchman
Watchman


Joined: 20 Apr 2005
Posts: 6780

PostPosted: Mon Jun 28, 2010 6:54 pm    Post subject: Reply with quote

Übrigens macht man die Links normalerweise natürlich nicht händisch. Dazu gibt es autools (hier insbesondere: libtool) oder als Minimum: ldconfig -N
Back to top
View user's profile Send private message
musv
Advocate
Advocate


Joined: 01 Dec 2002
Posts: 3366
Location: de

PostPosted: Tue Jun 29, 2010 12:29 pm    Post subject: Reply with quote

Das ist durchaus richtig. Mir ist es allerdings wichtig, dass ich wenigstens weiß, wie es händisch funktioniert. Wenn die IDE mit autoconf durchrattert, hab ich hinterher sonst keine Ahnung, warum irgendeine Lib nicht gefunden wurde.
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum