假设我有三个 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-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
那么如何创建等效的 LIB 以在 MinGW 中的可执行二进制文件中静态链接,以及如何链接它们?
显然,在 Windows 下:)
我在这里找到了解决方案:http://www.codeproject.com/Articles/84461/MinGW-Static-and-Dynamic-Libraries 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
, where -ltest -lre
是正确的,因为测试库指的是重新库。
这是我编译它的方法:
cc -c -o 测试.o 测试.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。 -l测试-lre
它也适用于 Tiny C 编译器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)