2010-01-21 5 views
7

Ich verwende gcc, um ein Programm zu kompilieren, das ich mit einer C-Bibliothek mit nicht standardmäßigen Namen verknüpfen muss; Es heißt stuff.a anstelle von libstuff.a.Verknüpfung der C-Bibliothek mit einem nicht standardmäßigen Namen

Ich kann den Namen der Datei nicht ändern (Berechtigungsprobleme).

Ich will nicht die vollständige Bibliothek enthalten (das heißt mit gcc program.c stuff.a -oprogram)

ich als gcc program.c -L/path/to/library/ -lstuff -oprogram kompilieren wollen aber gcc wird die Bibliothek nicht gefunden (weil es nicht libstuff.a genannt).

Ich arbeite an einer Linux-Box.

Wie kann ich die (dynamische) Verknüpfung machen?

EDIT:

Vielen Dank an alle, und ich entschuldige mich für eine schlecht formulierte Frage.

Ich hatte nicht einmal ein gemeinsames Objekt (ich dachte, ich könnte dynamisch zu einer * .a Datei verknüpfen), so dass dies viele von Ihnen verwirrt. Nochmals, Entschuldigung für meine Ignoranz.

Was ich getan habe, ist das gemeinsame Objekt in einem lokalen Verzeichnis zu erstellen, den Speicherort an meine Umgebungsvariable LD_LIBRARY_PATH anfügen und erneut verknüpfen.

Es funktioniert wie ein Charme (von 1.3M ausführbar bis 5.8K).

Nochmals vielen Dank.

+0

hat ein gemeinsam genutztes Objekt Version der Bibliothek vorhanden sind (stuff.so)? – jschmier

+0

vergessen zu erwähnen, ich arbeite an Linux. – Escualo

+0

@jschmier: Nein, nur die '.a' Bibliothek. – Escualo

Antwort

6

Unter der Annahme, dass eine freigegebene Objektversion der statischen Bibliothek nicht vorhanden ist, muss möglicherweise eine erstellt werden. Denken Sie daran, dass die statische Bibliothek stuff.a nur ein Archiv ist.

ar -x stuff.a 
gcc -shared *.o -o libstuff.so 

Dies setzt voraus, Sie wollen dagegen als gemeinsam genutzte Bibliothek verknüpfen und nicht einfach in die Binärdatei kompilieren.

+6

Interessant, aber die .o-Dateien müssen als positionsunabhängiger Code kompiliert worden sein, damit dies funktioniert, was sie möglicherweise nicht waren, wenn sie für eine statische Bibliothek bestimmt waren, oder? –

+1

Das ist die richtige Antwort, weil ich nicht einmal ein gemeinsames Objekt hatte. Am Ende habe ich eine erstellt und verlinkt. Von einer ausführbaren Datei von 1.3M (mit dem ursprünglichen Ansatz) übergab ich eine ausführbare Datei von 5.8K. Das ist fantastisch. Vielen Dank. – Escualo

+1

+1 für erweiterte Kristallkugel Nutzung oder Gedanken lesen Fähigkeiten;) – Christoph

4

Können Sie eine symbolische Verbindung zu stuff.a namens libstuff.a erstellen? Sie könnten sogar den Symlink in einem anderen Verzeichnis (d. H. Kein Standardbibliotheksverzeichnis) erstellen und die -L -Option mit gcc verwenden, um das Verzeichnis mit dem Symlink einzuschließen.

+0

Ich dachte daran, dies zu tun, und es könnte sein, was ich am Ende mache. Ich habe mich nur gefragt, ob es eine spezielle Flagge gibt, die ich an gcc weitergeben kann, um sie wissen zu lassen, dass der Name nicht Standard ist. – Escualo

3

Link es, wie Sie eine Objektdatei würde:

gcc blah.o /usr/local/lib/foo.a -o binary 

wenn Sie vollständigen Pfad nicht gefällt, nur eine Variable verwenden. sonst könnten Sie LD_LIBRARY_PATH und Testdatei für Existenz analysieren es

+0

@Arrieta: nicht nach dem GCC Handbuch – Christoph

+0

Vielen Dank, unbekannt, ich habe jetzt nicht dies. – Escualo

+1

Sie können nicht dynamisch mit der statischen Bibliothek verknüpfen, es muss Kompilierzeit statische Verknüpfung sein. Gemeinsame Objekte müssen mit PIC kompiliert werden, statische Bibliotheken werden normalerweise nicht so kompiliert. Sie müssen die shared library zur Laufzeit immer noch in den Speicher laden, es sei denn, Sie führen mehrere Threads aus. Sie werden nicht viel gewinnen. – Anycorn

1

einfach den vollständigen Namen geben:

gcc program.c /path/to/library/stuff.a -oprogram 
5

Sie sollten am gcc manual einen Blick genommen haben:

Der einzige Unterschied zwischen der Verwendung eines -l Option und Angabe eines Dateinamens ist, dass -l umgibt Bibliothek mit 'lib' und '.a' und durchsucht mehrere Verzeichnisse.

Es ist nichts falsch mit stuff.a als Argument zu verwenden.

+0

Es gab ein "(dynamisches)" in der ursprünglichen Frage, aber ich bin immer weniger sicher, dass das OP es wirklich meinte. –

+0

Danke. Ich war mir dessen nicht bewusst, und mit deinen und anderen Kommentaren bin ich jetzt in der Lage, mein Problem zu lösen. – Escualo

0

Ich kenne das Problem stellte sich heraus, eins zu sein mit dem Versuch, eine statische Bibliothek als dynamisch gelinkt zu setzen, aber ich wollte dieses willen für die Nachwelt hinzuzufügen:

Wenn Sie Ihr Argument an die -l Option mit einem Doppelpunkt Vorwort , :, behandelt es den Namen als Literal und nicht als einen Namen, der die "lib" an der Vorderseite und die Dateiendung am Ende benötigt.

Im Fall, dass Sie beschreiben, wo Sie gegen ein static.a verknüpfen wollen eher als ein libstatic.a, und vorausgesetzt, Sie dagegen statisch zu verknüpfen beabsichtigen, die folgenden funktionieren würde:

gcc program.c -L/path/to/library/ -l:stuff.a -oprogram 

Sie könnten natürlich tun, wie Richard Penington und Anycorn beide und einfach schließen die-voll pathed Bibliothek statt auf der Kommandozeile als auch erwähnt haben:

gcc program.c /path/to/library/stuff.a -oprogram 
Verwandte Themen