假设我有三个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(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下:)
答案 0 :(得分:12)
我在这里找到了解决方案: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
会出现{{1}}等错误。正确的,因为测试库是指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编译器。
答案 1 :(得分:1)
您是否尝试过使用这些选项: -static -mwindows