2012-05-27 22 views
8

Supponiamo di disporre di tre file sorgente C. I primi due sono LIBs (lib * .a?), E il terzo è un'applicazione che li usa.Collegamento statico di librerie in MinGW

Il primo è (re.c):

int re(int i) { 
    return i; 
} 

Il secondo è (test.c):

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

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

E il terzo è (main.c):

#include<stdio.h> 

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

int main(void) { 

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

Ora come posso creare i primi due LIB in modo tale da permettermi di collegarli staticamente in un secondo momento con l'applicazione principale?

so come creare le DLL e collegarli in modo dinamico nella mia applicazione come ad esempio:

cc -o re.dll re.c -shared -Wl, - out-IMPLIB = libre.a (per re.c)

cc -o test.dll test.c -L. -lre -shared -Wl, - out-implib = libtest.a (per test.c)

cc -o main.exe main.c -L. -lre -ltest


Così come creare LIBS equivalenti a essere staticamente collegati nel mio binario eseguibile in MinGW, e come collegarli?

Ovviamente, sotto Windows :)

risposta

11

ho trovato la soluzione qui: http://www.codeproject.com/Articles/84461/MinGW-Static-and-Dynamic-Libraries

L'idea dell'essere è quello di compilare tutte le librerie (file sorgente) senza collegamento. Quindi convertire gli oggetti di output con ar rcs -o lib*.a *.o dove * è il nome degli oggetti creati (convertendoli uno ad uno). Successivamente, compiliamo semplicemente l'applicazione con -L. per specificare la directory e con -l* per specificare i nomi di librerie senza la decorazione di denominazione GNU.

Per quelle librerie che dipende altri, occorre precisare e poi le librerie riferimento, oppure errori quali undefined reference to re si verificherà quando feci -lre -ltest, dove -ltest -lre è quello giusto, perché libreria di test si riferisce a ri libreria .

Ecco come ho compilato esso:

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

Funziona anche con il compilatore Tiny C.

1

Hai provato a usare le opzioni: -mwindows -static

+0

Ho usato -statico, ma sembra inutile. Non ho usato -mwindows, comunque. Che cos'è? –

+0

-mwindows specifica un'applicazione gui, -monsole un'applicazione console in mingw. Mi chiedo solo se questi hanno qualcosa che aiuti. Collega anche le librerie di Windows all'applicazione se queste sono mancanti. Hai provato a dependencywalker per vedere quali sono mancanti? – rotator

0

In aggiunta alla risposta di Ghasan. (È possibile costruirlo statico se sono disponibili tutti i file% .a e gli oggetti)

La maggior parte delle librerie in mingw sono statiche come è possibile vedere nella directory lib/(tutto il file% .a). Nel mio caso le dipendenze condivise sono solo libstd ++ - 6.dll e libgcc_s_dw2-1.dll che non sono affatto presenti nella libreria statica.

Non è stato possibile eseguire il mio file eseguibile senza quelle due librerie condivise. Come si legge nella descrizione,

Questa libreria è liberamente ridistribuibile; è richiesto da (e tu devi distribuirlo con ), qualsiasi applicazione compilata dal compilatore di linguaggio GNU C++ , a meno che il supporto per le librerie di runtime condivise sia disabilitato esplicitamente durante la compilazione.

Problemi correlati