Wie kann ich eine statische Bibliothek kompilieren
Ich versuche zu kompilieren einer statischen Bibliothek. Ich folgte den Schritten, die gegeben wurden, in einer Antwort auf diese Frage aber es funktioniert nicht. Folgendes ist mein makefile.
PROJECT = lq.a
OBJECTS = dlmalloc.o queue.o.o
CFLAGS = -o -Wall -pedantic
all: $(PROJECT)
.c.o:
gcc -c $(CFLAGS) $<
$(PROJECT): $(OBJECTS)
libtool -o $(PROJECT) -static $(OBJECTS)
Und ich bekomme die folgende Fehlermeldung.
libtool: unrecognized option `-o'
Was ist die richtige Art und Weise des Schreibens dieses Makefiles?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie das Programm
ar
zum erstellen von statischen Bibliotheken mit der folgenden syntax:So, in Ihrem Fall:
Finden Sie eine Erläuterung der Optionen auf der Mann Seite, aber im Grunde:
r
sagt legen Sie die Objekt-Dateien in das Archiv (ersetzt alle älteren Versionen der gleichen Sache)c
sagt, das Archiv, wenn es nicht bereits vorhanden ist (normalerweise geschieht dies sowieso, aber diese option unterdrückt die Warnung).s
sagt zum schreiben eines Objekt-index-Datei in dem Archiv.Entweder
libtool
oder nicht. Wenn du gehst, es zu benutzen, dann sollten Sie kompilieren Sie die einzelnen Dateien mitlibtool --mode=compile
sowie die Verknüpfung mitlibtool --mode=link
. Wenn du nicht gehst, zu verwendenlibtool
, dann wird Ihr link sollte getan werden, mitgcc
auch, wie schon in einer anderen Antwort. Auch haben Sie versuchtman libtool
?man libtool
, und es ist nicht offensichtlich, warum sollte-o
eine nicht erkannte option auf Linux, aber mit der richtigen Reihenfolge der Argumente, es kann erkannt werden (siehe meine Antwort hier).libtool
akzeptiert keine option-o
, so ist es eine "nicht erkannte option". Sobald Sie geben Sie eine--mode=<something>
option zu sagenlibtool
was zu tun ist, dann weitere Optionen können übergeben werden an die Werkzeugelibtool
ruft. Solibtool --mode=link -o something
vielleicht ok sein, aberlibtool -o something
ist nicht. Entweder Weg, verwenden Sie entwederlibtool
für den compile-und link-Stadien, oder nicht verwenden, es überhaupt nicht - Sie sind nur zu Fragen für die Verwirrung mitgcc
zu kompilieren, aberlibtool
link.Die folgenden Befehle erstellen die statische Bibliothek:
Gut, das ist verwirrend, aber ich denke, dass die
libtool -o $(PROJECT) -static $(OBJECTS)
line (auch erwähnt in objective-c - Kombinieren statische Bibliotheken) kommt vom Mac, und anscheinend dielibtool
es ist NICHT die gleiche wie unter Linux:libtool oder ar & ranlib - idevgames Foren:
Ok, das erklärt den Unterschied - aber immer noch nicht erklären, wie
-o
kann eine nicht erkannte option, wenn ich habe gerade gesehen, das es aus einem Makefile auf Linux! So fand ich dies:bug-libtool-mailing-Liste (2001): Re: bug in libtool?
Oh je... nun, was macht es besonders verwirrend, ist dieser Hinweis in
libtool --mode=link --help
:So, wenn ich haben angeben
LINK-COMMAND
- und zur gleichen Zeit, ich geben Sie einOUTPUT-FILE
endet in.a
; der Befehl sollte dann laufen,LINK-COMMAND
- oder diear
+ranlib
dass die Verlängerung.a
gibt? Nun - hier ist ein terminal-snippet, nur testen dasbash
Skript Logik derlibtool
- ohne jede Zusammenstellung (obwohl eine leere Archiv wird erstellt):Also - nicht nur, dass Sie angeben müssen
--mode
, aber wenn dieser Moduslink
, MÜSSEN Sie irgendeine Art von argument (LINK-KOMMANDO) bezogen auf ein Werkzeug; ABER das LINK-KOMMANDO argument braucht nicht einmal zu existieren als real Programm - da müssen Sie geben Sie eine Ausgabe-Datei ohnehin; und wenn die Ausgabe-Datei endet auf.a
es erzwingt die Verwendung vonar
/ranlib
sowieso.Außerdem sollten Sie ein problem haben mit einem tag - bewegen Sie einfach die
--tag
argument vor dem LINK-BEFEHL - argument-und Sie können Kraftlibtool
zu laufen, mit einem nicht vorhandenen tag und einen nicht vorhandenen LINK-BEFEHL (wo es den Betrieb angegeben wird allein durch die Erweiterung.a
von der Ausgabe-Datei) - solange die Argumente sind eingetragen in der richtigen Reihenfolge für dielibtool
syntax; das muss ich zugeben, ist nicht wirklich dokumentiert, die in das Skript selbst.Aber wieder zu kommen, um die Mac -
libtool -o $(PROJECT) -static $(OBJECTS)
Linie, die kombinieren statische Bibliotheken; wenn Sie versuchen, das gleiche zu tun mit der richtigen statischen Bibliothek.a
Dateien, werden Sie feststellen, dasslibtool
schiebt die.a
Archive als solche in der Ausgabe Archiv nicht Ihre Bestandteile Objekt-Dateien - also diese Ausgabe ist keine gültige ELF-Objekt mehr; hier ist ein Beispiel für eine entsprechende Linux -libtool
Linie, mit zwei richtigen library-Dateien, die ich erzeugt haben:So, als akzeptierte Antwort sagt - auf Linux, verwenden Sie
ar
manuell zu entpacken und pack wieder zu kombinieren statische Bibliotheken.Hoffe, dies hilft jemand,
Prost!