在MinGW中静态链接库

假设我有三个C源文件。 前两个是LIB(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("%dn",test(0));
    return 0;
}

现在,我怎样才能创建前两个LIB,让我稍后将它们静态链接到主应用程序?

我知道如何创建DLL并在我的应用程序中动态链接它们,例如:

cc -o re.dll re.c -shared -Wl, - out-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


那么如何在MinGW中的可执行二进制文件中创建静态链接的等效LIB以及如何链接它们?

显然,在Windows下:)


我在这里找到了解决方案:http://www.codeproject.com/Articles/84461/MinGW-Static-and-Dynamic-Libraries

想法是编译所有库(源文件),而不用链接。 然后使用ar rcs -o lib*.a *.o转换输出对象,其中*是创建的对象的名称(逐个转换它们)。 之后,我们只需使用-L.编译应用程序-L. 指定目录并使用-l*指定不带GNU命名装饰的库名称。

对于那些依赖于别人的库,应该首先指定它们,然后指定引用的库,否则,当我执行-lre -ltest ,会出现错误( -lre -ltest undefined reference to re ,其中-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

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

它也适用于Tiny C编译器。


你有没有尝试过使用这些选项:-static -mwindows


加入Ghasan的答案。 (如果所有%.a文件和目标文件都可用,可以将其构建为静态的)

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

没有这两个共享库,我无法运行我的可执行文件。 如说明所述,

这是免费的可再发行的库; 除非在构建时显式禁用对共享运行时库的支持,否则必须由(并且必须分发)任何由GNU C ++语言编译器编译的应用程序。

链接地址: http://www.djcxy.com/p/64373.html

上一篇: Statically linking libraries in MinGW

下一篇: Is It possible to Linking static library into dynamic library in Visual Studio?