Angenommen, ich habe drei C-Quelldateien. Die ersten beiden sind LIBs (lib * .a?), Und die dritte ist eine Anwendung, die sie verwendet.
Der erste ist (rec.c):
%Vor%Die zweite ist (test.c):
%Vor%Und der dritte ist (main.c):
%Vor%Wie kann ich nun die ersten beiden LIBs so erstellen, dass ich sie später statisch mit der Hauptanwendung verknüpfen kann?
Ich weiß, wie ich die DLLs erstellen und dynamisch in meiner Anwendung verknüpfen kann, wie zum Beispiel:
cc -o re.dll re.c -shared -Wl, - out-implib = libre.a (für re.c)
cc -o test.dll test.c -L. -lre -shared -Wl, - out-implib = libtest.a (für test.c)
cc -o main.exe main.c -L. -lre -ltest
Also, wie man äquivalente LIBs erzeugt, um innerhalb meiner ausführbaren Binärdatei in MinGW statisch verknüpft zu werden, und wie man sie verbindet?
Offensichtlich, unter Windows:)
Ich habe die Lösung hier gefunden: Ссылка
Die Idee besteht darin, alle Bibliotheken (Quelldateien) ohne Verknüpfung zu kompilieren. Konvertieren Sie dann die Ausgabeobjekte mit ar rcs -o lib*.a *.o
, wobei * der Name der erstellten Objekte ist (sie einzeln umwandeln). Danach kompilieren wir einfach die Anwendung mit -L.
, um das Verzeichnis anzugeben, und mit -l*
, um Bibliotheksnamen ohne GNU-Namensdekoration anzugeben.
Für solche Bibliotheken, die von anderen abhängen, sollten sie zuerst und dann die referenzierten Bibliotheken angegeben werden, sonst werden Fehler wie undefined reference to re
auftreten, wenn ich -lre -ltest
gemacht habe, wobei -ltest -lre
die richtige ist, weil test Bibliothek bezieht sich auf re Bibliothek.
Hier ist, wie ich es zusammengestellt habe:
cc -c -o test.o re.c
cc -c -o re.o re.c
ar rcs -o libtest.a test.o
ar rcs -o libre.a re.o
cc -o main.exe main.c -L. -ltest -lre
Es funktioniert auch für den Tiny C Compiler.
Hinzufügen zu Ghasans Antwort. (Es ist möglich, es statisch zu erstellen, wenn alle% .a-Dateien und Objektdateien verfügbar sind)
Die meisten Bibliotheken in mingw sind statisch, wie ich im lib / Verzeichnis sehen kann (alle% .a Datei). In meinem Fall sind die shared-Abhängigkeiten nur die Bibliotheken libstd ++ - 6.dll und libgcc_s_dw2-1.dll, die überhaupt nicht in der statischen Bibliothek vorhanden sind.
Ich konnte meine ausführbare Datei ohne diese beiden gemeinsam genutzten Bibliotheken nicht ausführen. Wie die Beschreibung liest,
Dies ist eine frei verteilbare Bibliothek; es ist erforderlich von, (und du muss es verteilen), jede Anwendung, die von GNU C ++ kompiliert wurde Sprachcompiler, es sei denn, die Unterstützung für gemeinsam genutzte Laufzeitbibliotheken ist beim Bauen explizit deaktiviert.
Tags und Links mingw static-libraries