10

假设我有三个 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("%d\n",test(0));
    return 0;
}

现在如何创建前两个 LIB,以便稍后将它们静态链接到主应用程序?

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

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


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

显然,在 Windows 下:)

4

3 回答 3

16

我在这里找到了解决方案: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是对的,因为测试库引用了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 编译器。

于 2012-05-27T16:45:49.910 回答
1

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

于 2012-05-27T15:46:57.863 回答
0

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

正如我在 lib/ 目录(所有 %.a 文件)中看到的那样,mingw 中的大多数库都是静态的。在我的情况下,共享依赖项只是静态库中根本不存在的 libstd++-6.dll 和 libgcc_s_dw2-1.dll。

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

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

于 2018-02-26T21:09:47.707 回答