静态链接库中的MinGW(Statically linking libraries in MinGW

2019-07-29 14:01发布

假设我有三个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下:)

Answer 1:

我发现这里的解决方案: 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编译器。



Answer 2:

您是否尝试过使用的选项:-static -mwindows



Answer 3:

添加到Ghasan的答案。 (这是可能建立它静若所有%.a文件和目标文件都可以)

大多数MinGW的库都是静态的,因为我可以在lib /目录(所有%.A文件)看到。 在我的情况下共享依赖是只有libstd ++ - 6.dll和libgcc_s_dw2-1.dll这是不存在的静态库的。

我无法运行我的可执行文件没有这两个共享库。 作为描述读取,

这是可自由配置的库; 它被要求,(你必须分发),由GNU C ++语言编译器编译的任何应用程序,除非在构建共享运行库支持被明确禁用。



文章来源: Statically linking libraries in MinGW