假设我有三个C源文件。 前两种是LIBS(LIB * .A?),第三个是使用它们的应用程序。
首先是(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;
}
现在,我怎么能创造这样的方式,让我静与主应用程序后链接它们的前两个库?
我知道如何创建DLL和我的应用程序,如动态链接它们:
立方厘米-o re.dll re.c -shared -Wl, - 外IMPLIB = libre.a(对于re.c)
立方厘米-o Test.dll的test.c的-L。 -lre -shared -Wl, - 外IMPLIB = libtest.a(对于test.c的)
立方厘米-o MAIN.EXE的main.c -L。 -lre -ltest
那么如何来创建等同LIBS我在MinGW的可执行的二进制内静态链接,以及如何将其链接?
显然,在Windows下:)
我发现这里的解决方案: http://www.codeproject.com/Articles/84461/MinGW-Static-and-Dynamic-Libraries
这个想法是为编译所有的库(源文件)不链接。 然后用转换输出对象ar rcs -o lib*.a *.o
其中*为创建的对象的名称(转换逐一)。 在那之后,我们只需编译应用-L.
到指定目录,并与-l*
无需GNU命名装修指定库名。
对于那些依赖于他人的库,它们应该被指定,然后再引用库,否则错误,例如undefined reference to re
当我这样做会发生-lre -ltest
,其中-ltest -lre
是正确的,因为测试库是指重新库。
这是我如何编译它:
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
立方厘米-o MAIN.EXE的main.c -L。 -ltest -lre
这也适用于微小的C编译器。
您是否尝试过使用的选项:-static -mwindows
添加到Ghasan的答案。 (这是可能建立它静若所有%.a文件和目标文件都可以)
大多数MinGW的库都是静态的,因为我可以在lib /目录(所有%.A文件)看到。 在我的情况下共享依赖是只有libstd ++ - 6.dll和libgcc_s_dw2-1.dll这是不存在的静态库的。
我无法运行我的可执行文件没有这两个共享库。 作为描述读取,
这是可自由配置的库; 它被要求,(你必须分发),由GNU C ++语言编译器编译的任何应用程序,除非在构建共享运行库支持被明确禁用。