2012-05-27 9 views
8

Angenommen, ich habe drei C-Quelldateien. Die ersten beiden sind LIBs (lib * .a?), Und die dritte ist eine Anwendung, die sie verwendet.Statische Verknüpfung von Bibliotheken in MinGW

Die erste ist (re.c):

int re(int i) { 
    return i; 
} 

Die zweite ist (test.c):

int re(int); // Depends on re.c 

int test(int i) { 
    return re(i); 
} 

und das dritte (main.c):

#include<stdio.h> 

int test(int); // Uses test.c 

int main(void) { 

    printf("%d\n",test(0)); 
    return 0; 
} 

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 die DLLs erstellen und diese dynamisch in meiner Anwendung verknüpfen, wie:

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


Wie gleichwertig LIBs erstellen statisch in meinem ausführbaren Binärdatei in MinGW verknüpft werden, und wie sie verknüpfen?

Offensichtlich unter Windows :)

Antwort

11

ich die Lösung hier: http://www.codeproject.com/Articles/84461/MinGW-Static-and-Dynamic-Libraries

Die Idee dahinter ist, alle Bibliotheken zu kompilieren (Quelldateien) ohne Verknüpfung. Konvertieren Sie dann die Ausgabeobjekte mit ar rcs -o lib*.a *.o, wobei * der Name der erstellten Objekte ist (einzeln umwandeln). Danach kompilieren wir einfach die Anwendung mit -L., um das Verzeichnis anzugeben und mit -l*, um Bibliotheksnamen ohne GNU Naming Decoration anzugeben.

Für die Libs, die auf anderen abhängt, sollte sie die referenzierten Libs oder auch Fehler wie undefined reference to re tritt auf, wenn ich -lre -ltest tat und dann angegeben werden, wobei -ltest -lre die richtige ist, weil Testbibliothek Bibliothek wieder verweist .

Hier ist, wie ich es kompiliert:

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 Tiny C Compiler.

1

Haben Sie versucht, die Optionen: -static -mwindows

+0

Ich verwendete -static, aber es scheint nichts zu tun. Ich habe -mwindows jedoch nicht benutzt. Was ist es? –

+0

-mwindows gibt eine GUI-Anwendung an, -mconsole eine Konsolenanwendung in mingw. Ich frage mich nur, ob diese etwas haben, das hilft. Es verknüpft auch Windows-Bibliotheken mit der Anwendung, wenn diese nicht vorhanden sind. Hast du versucht, dependencywalker zu sehen, welche fehlen? – rotator

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 zwei shared-libraries nicht ausführen. Wie die Beschreibung lautet,

Dies ist frei verteilbare Bibliothek; Es wird benötigt von (und Sie müssen es verteilen), jede Anwendung kompiliert von der GNU C++ Sprache Compiler, es sei denn Unterstützung für gemeinsam genutzte Laufzeitbibliotheken ist explizit beim Erstellen deaktiviert.

Verwandte Themen