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/library

    In 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 nett 🙂

    Mfg, 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 2

    Mfg, Lord Kefir


Log in to reply