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
.
Ich kann den Namen der Datei nicht ändern (Berechtigungsprobleme).
Ich möchte die vollständige Bibliothek nicht einschließen (d. h. gcc program.c stuff.a -oprogram
verwenden)
Ich möchte als gcc program.c -L/path/to/library/ -lstuff -oprogram
kompilieren, aber gcc findet die Bibliothek nicht (weil sie nicht libstuff.a
heißt).
Ich arbeite an einer Linux-Box.
Wie kann ich die (dynamische) Verknüpfung machen?
BEARBEITEN:
Ich danke Ihnen allen und entschuldige mich für eine schlecht formulierte Frage.
Ich hatte nicht einmal ein gemeinsames Objekt (ich dachte, ich könnte es dynamisch mit einer * .a-Datei verknüpfen), was viele von euch verwirrt hat. Nochmals, Entschuldigung für meine Ignoranz.
Was ich getan habe, ist das Erstellen des gemeinsamen Objekts in einem lokalen Verzeichnis, das Anfügen der Position an meine Umgebungsvariable LD_LIBRARY_PATH und das erneute Verknüpfen.
Es funktioniert wie ein Zauber (von 1.3M ausführbar bis 5.8K).
Nochmals vielen Dank.
Unter der Annahme, dass eine freigegebene Objektversion der statischen Bibliothek nicht vorhanden ist, muss möglicherweise eine solche erstellt werden. Denken Sie daran, dass die statische Bibliothek stuff.a nur ein Archiv ist.
%Vor%Dies setzt voraus, dass Sie wollen als Shared Library dagegen verlinken und nicht einfach in Ihre Binärdatei kompilieren.
Sie sollten sich das gcc-Handbuch angesehen haben:
Der einzige Unterschied zwischen der Verwendung eines -l-Option und Angabe eines Dateinamens ist, dass
-l
umgibt Bibliothek mit 'lib' und '.a' und sucht mehrere Verzeichnisse.
Es ist nichts falsch daran, stuff.a
als Argument zu verwenden.
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.
Ich weiß, dass das Problem darin bestand, eine statische Bibliothek dynamisch verlinken zu lassen, aber das wollte ich der Nachwelt hinzufügen:
Wenn Sie Ihr Argument der Option -l
mit einem Doppelpunkt voranstellen, :
, behandelt es den Namen als Literal und nicht als einen Namen, der "lib" an der Vorderseite und die Dateierweiterung am Ende benötigt .
Wenn Sie angeben, wo Sie mit einem static.a
anstatt mit einem libstatic.a
verknüpfen möchten, und davon ausgehen, dass Sie dagegen statisch verknüpfen möchten, würde Folgendes funktionieren:
Sie könnten natürlich tun, wie Richard Penington und Anycorn beide erwähnt haben, und einfach die voll-pathed Bibliothek in die Befehlszeile einfügen:
%Vor%