Frage zum linken von shared libraries
-
Tach auch!
In meinem Leben habe ich nie viel mit selbstgeschriebenen libraries zu tun gehabt. Jetzt ist allerdings folgender Fall eingetreten.
Ich meinem Projekt habe ich in etwa folgende Verzeichnisstruktur:
project/modul1
project/modul2
project/libraryIn jedem Unterordner ist ein Makefile. Ich möchte nun als erstes die library kompilieren und anschließend meine eizelnen Module, welche diese library benötigen. Wie schaffe ich es nun, dass meine library gefunden wird?!
Ich habe z.B. folgende Anweisung benutzt: "gcc blabla.c -o blabla -L../library -lname" - allerdings ohne Erfolg. Ein kleiner Tipp wäre ganz nettMfg, Lord Kefir
-
das ist eigentlich schon der richtige Ansatz. Du solltest vielleicht mal den Fehler verraten
Kann es vielleicht sein, dass du LD_CONFIG_PATH nicht angepasst hast und der Loader beim starten der Anwendung die SO nicht findet?
-
Hm, habe mich wohl nicht deutlich genug ausgedrückt - liegt wohl daran, dass ich gerade von der Arbeit gekommen bin und mein Hirn etwas matschig ist
Also, wenn ich die library normal installiere funktioniert das ganze (also z.B. nach '/usr/lib' kopieren und anschließend 'ldconfig /usr/lib' ausführen). Das möchte ich allerdings nicht. Die library soll noch vor der eigentlichen Installation gefunden werden.
Das ist z.B. das momentan zusammengefrickelte Makefile der library:
PREFIX=/usr/local CC=/usr/bin/gcc CFLAGS=-std=c99 -Wall -O3 -mtune=$(shell uname -m) LDCONFIG=/sbin/ldconfig all: rsa.c rsa.h fnordcrypt.h $(CC) -fPIC -g -$(CFLAGS) -c rsa.c $(CC) -shared -Wl,-soname,libfnordcrypt.so -o libfnordcrypt.so.0.1.0 rsa.o -lc $(LDCONFIG) -l libfnordcrypt.so.0.1.0 clean: rm -f *.o rm -f libfnordcrypt.so.0.1.0 rm -f libfnordcrypt.so
Das nächste Makefile soll mein Programm kompileren, welches die library benötigt. Das sieht dann so aus:
PREFIX=/usr/local CC=/usr/bin/gcc CFLAGS=-std=c99 -Wall -O3 -mtune=i686 LDCONFIG=/sbin/ldconfig LIBRARY_PATHS=../libfnordcrypt INCLUDE_PATHS=../libfnordcrypt all: $(CC) server.c -o fnordserver $(CFLAGS) -L$(LIBRARY_PATHS) -I$(INCLUDE_PATHS) -lpthread -lfnordcrypt
Ich möchte also, dass die library sozusagen temporär gecached wird. Sie soll erst wirklich "installiert" werden, wenn auch das Programm installiert wird. Das Problem ist jetzt, dass beim Kompilieren der Applikation die library nicht gefunden wird:
/usr/bin/gcc server.c -o fnordserver -std=c99 -Wall -O3 -mtune=i686 -L../libfnordcrypt -I../libfnordcrypt -lpthread -lfnordcrypt
/usr/lib/gcc/i486-slackware-linux/3.4.6/../../../../i486-slackware-linux/bin/ld: cannot find -lfnordcrypt
collect2: ld returned 1 exit status
make[1]: *** [all] Error 1
make[1]: Leaving directory `/home/lordkefir/fnordlog/server'
make: *** [all] Error 2Mfg, Lord Kefir