2009-05-29 4 views
1

Ich versuche zu lernen, wie man eine C/C++ - Bibliothek in einer Linux-Umgebung erstellen, aber ich habe ein Problem (wahrscheinlich ein triviales) online Tutorials hatten nicht geholfen, zu lösen.Erstellen von Bibliotheken in C/C++ - ld kann meine Bibliothek nicht finden

Für Bestimmtheit lassen Sie uns sagen, dass ich eine foo.c Datei mit dem folgenden Code haben:

//file: foo.c 
#include <stdio.h> 
void hello(void) 
{ 
    printf("hello!\n"); 
} 

ein foo.h:

//file: foo.h 
void hello(void); 

und ein Programm, das die Funktion verwendet hallo() von foo.c, genannt prog.c:

//file: prog.c 

#include "foo.h" 

int main(void) 
{ 
    hello(); 
    return 0; 
} 

die drei Dateien sind alle auf dem gleichen Verzeichnis. Dann kompilierte ich foo.c mit:

gcc -fPIC -c foo.c 

und bekam eine foo.o Datei. Dann habe ich ld die Bibliotheksdatei zu erstellen:

ld -G foo.o -o libfoo.so 

Aber wenn ich versuche prog.c zu kompilieren mit:

gcc -o prog prog.c -lfoo 

bekam ich eine Fehlermeldung:

/usr/bin/ld: cannot find -lfoo 
collect2: ld returned 1 exit status 

I‘ Ich bin überzeugt, dass dies eine Art triviales Pfadproblem ist, aber ich konnte keine Lösung finden. Also meine Frage ist wirklich, ob diese Prozedur oben falsch ist oder wenn ich die libfoo.so Datei in einen speziellen Pfad legen muss.

Eine andere Frage ist, wie sich das ändert, wenn ich g ++ anstelle von gcc verwende.

Danke.

EDIT:

Ich weiß, dass ich sowohl prog.c und foo.c kompilieren kann prog.o und foo.o ein sie dann verknüpfen, um eine ausführbare Datei zu machen. Aber in meinem ursprünglichen Problem möchte ich foo.c auf eine Weise kompilieren, die ich an Leute verteilen kann, die meine Funktionen in ihren eigenen Programmen verwenden werden.

Antwort

6

ld sucht standardmäßig nicht im aktuellen Verzeichnis. Wenn Sie dies möchten, müssen Sie die Befehlszeilenoption -L verwenden. Wenn sich Ihre Bibliothek im aktuellen Verzeichnis befindet, müssen Sie dem letzten gcc-Aufruf -L. hinzufügen. Wenn die Bibliothek dynamisch verknüpft ist, müssen Sie auch das aktuelle Verzeichnis zur Umgebungsvariablen LD_LIBRARY_PATH hinzufügen (ich nehme an, Sie sind auf Linux).

Wenn Ihre Bibliothek in einem anderen nicht standardmäßigen Pfad ist, müssen Sie diesen anstelle des aktuellen Verzeichnisses verwenden.

3

gcc -o prog prog.c -lfoo -L. 

Der L-Schalter auf den Satz von Pfaden Versuchen ihr Argument fügt hinzu, dass ld in Bibliotheksdateien sucht. Die Syntax ist für g ++ identisch.

+0

Hummmm ... richtig. Gibt es einen Pfad im System, wo ld automatisch nach den Bibliotheken sucht? –

+0

Ja - das ist/usr/local/lib /, dann/usr/lib /. –