在MinGW中静态链接库

Gha*_*san 8 mingw static-libraries

假设我有三个C源文件.前两个是LIB(lib*.a?),第三个是使用它们的应用程序.

第一个是(re.c):

int re(int i) {
    return i;
}
Run Code Online (Sandbox Code Playgroud)

第二个是(test.c):

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

int test(int i) {
    return re(i);
}
Run Code Online (Sandbox Code Playgroud)

第三个是(main.c):

#include<stdio.h>

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

int main(void) {

    printf("%d\n",test(0));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,我如何以这样的方式创建前两个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(对于test.c)

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


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

显然,在Windows下:)

Gha*_*san 14

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

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

对于那些依赖于其他的lib,应首先指定它们,然后指定引用的lib,否则undefined reference to re会出现错误,例如,当我这样做时-lre -ltest,哪里-ltest -lre是正确的,因为测试库指的是re库.

这是我编译它的方式:

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 Compiler.