Statisches Verknüpfen von Bibliotheken in MinGW

8

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:)

    
Ghasan Al-Sakkaf 27.05.2012, 15:03
quelle

3 Antworten

11

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.

    
Ghasan Al-Sakkaf 27.05.2012, 16:45
quelle
1

Haben Sie versucht, die Optionen zu verwenden: -static -mwindows

    
rotator 27.05.2012 15:46
quelle
0

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.

    
shuva 26.02.2018 21:09
quelle

Tags und Links