在MinGW中静态链接库

11

假设我有三个C源代码文件。前两个是库文件(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;
}
现在我该如何创建前两个LIB,以便稍后可以将它们静态链接到主应用程序中呢?我知道如何创建DLL并在我的应用程序中进行动态链接,例如:
cc -o re.dll re.c -shared -Wl,--out-implib=libre.a (对于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下 :)
3个回答

16

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

思路是将所有库(源文件)编译成目标文件,不进行链接。然后使用ar rcs -o lib*.a *.o命令将输出的目标文件转换为静态库文件,其中*代表创建的各个目标文件名称(逐一转换)。之后,我们只需使用-L.指定目录并使用-l*指定库名称(不带GNU命名装饰),即可编译应用程序。

对于依赖其他库的库,应首先指定它们,然后引用库,否则会出现错误,例如-lre -ltest可能会导致undefined reference to re错误,正确的方式是使用-ltest -lre,因为test库依赖于re库。

以下是编译代码:

cc -c -o test.o test.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编译器也适用。


1

您尝试过使用以下选项吗: -static -mwindows


我使用了-static,但好像没有用。我没有使用-mwindows,那是什么? - Ghasan غسان
-mwindows指定了一个GUI应用程序,-mconsole指定了一个控制台应用程序在mingw中。我只是想知道它们是否有任何帮助。如果这些库文件缺失,它还会将Windows库链接到应用程序中。您尝试使用DependencyWalker查看缺少哪些库文件了吗? - rotator

0

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

我发现mingw中的大多数库都是静态的,可以在lib/目录下看到所有的%.a文件。在我的情况下,共享依赖项仅为libstd++-6.dll和libgcc_s_dw2-1.dll,这两个文件在静态库中根本不存在。

如果没有这两个共享库,我无法运行我的可执行文件。正如描述所述:

这是一个自由可再分配的库;它是GNU C++语言编译器编译的任何应用程序所必需的(并且您必须随之分发),除非在构建时明确禁用了对共享运行时库的支持。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接