2012-05-27 49 views
8

假設我有三個C源文件。前兩個是LIB(lib * .a?),第三個是使用它們的應用程序。在MinGW中靜態鏈接庫

首先是(re.c):

int re(int i) { 
    return i; 
} 

第二個是(test.c的):

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

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

而第三個是(main.c中):

#include<stdio.h> 

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

int main(void) { 

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

現在我該如何創建前兩個LIB,以便我可以稍後將它們靜態鏈接到主應用程序?

我知道如何創建DLL和我的應用程序動態鏈接它們,例如:

CC -o re.dll re.c -shared -Wl, - 出IMPLIB = libre.a (for re.c)

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

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


那麼如何來創建等同LIBS將靜態我在MinGW的可執行的二進制內聯,以及如何將其鏈接?

顯然,視窗:)下

回答

11

我發現這裏的解決方案:http://www.codeproject.com/Articles/84461/MinGW-Static-and-Dynamic-Libraries

的想法是爲編譯所有的庫(源文件)而無需鏈接。然後用ar rcs -o lib*.a *.o轉換輸出對象,其中*是創建的對象的名稱(逐個轉換它們)。之後,我們只需編譯該應用程序-L.來指定目錄,並用-l*來指定沒有GNU命名裝飾的庫名稱。

對於那些依賴於他人的庫,它們應該被指定,然後再因爲測試庫是指重新庫引用庫,要不然會當我做-lre -ltest,其中-ltest -lre是正確的出現錯誤,如undefined reference to re, 。

這是我如何編譯它:

CC -c -o test.o re.c

CC -c -o re.o re.c

AR RCS - ølibtest.a test.o

AR RCS -o libre.a re.o

立方厘米-o MAIN.EXE的main.c -L。-ltest -lre

它也適用於Tiny C編譯器。

1

您是否嘗試過使用的選項: -static -mwindows

+0

我用過-static,但似乎沒用。不過,我沒有使用-mwindows。它是什麼? –

+0

-mwindows指定gui應用程序,-mconsole是mingw中的控制檯應用程序。只是想知道這些是否有幫助。它還將Windows庫鏈接到應用程序,如果這些是缺少的。你有沒有嘗試使用dependencywalker來查看哪些失蹤? – rotator

0

添加到Ghasan的回答。 (如果所有%.a文件和目標文件都可用,則可以將其構建爲靜態)

mingw中的大多數庫都是靜態的,因爲我可以在lib /目錄(所有%.a文件)中看到它們。在我的情況下,共享依賴只是libstd ++ - 6.dll和libgcc_s_dw2-1.dll,它們完全不在靜態庫中。

如果沒有這兩個共享庫,我無法運行我的可執行文件。如描述所示,

這是可自由再分發的庫; (必須由您分發),任何由GNU C++ 語言編譯器編譯的應用程序,除非在構建時明確禁用對共享運行時庫的支持 。