我正在寻找在Linux或Macos中为Windows编译静态库的方法,似乎有交叉编译器为this one生成.a库。但这不是我想要的,我想要的是Windows的.lib静态库文件,最好是Visual Studio。我知道我可以运行Windows虚拟机并使用Visual Studio,但这太重了,无法在命令行中完成。
答案 0 :(得分:6)
对于类似Unix的操作系统(Linux,MacOS等),静态库表示
一个ar
archive个目标文件。 ar
是GNU将军
目的档案。它并不关心您将哪种文件存入存档。它的
当它们碰巧是目标文件时,只是将它称为“静态库”的自定义。和
它也只是ar
存档的自定义*.a
。你可以打电话给它
*.lib
,或任何其他内容。
对于Visual Studio,静态库表示PE格式目标文件的存档
通常由Microsoft工具LIB
创建。
Microsoft LIB存档的格式实际上与Unix ar
存档的格式相同。微软
很久以前就采用了它。
所以如果你使用你的发行版的PE交叉编译器在Linux上编译一些PE目标文件
然后将它们归档到*.lib
ar
,你自己有一个静态库,在Windows中很好用
使用Visual Studio编译器。
好吧,只要这些目标文件具有C二进制接口,就可以了。 如果它们中的任何一个具有C ++接口,它们就没用了:Microsoft和GCC C ++编译器使用不同的名称修改协议,否则ABI不兼容。
<强>演示强>
我们在linux中开始使用静态库的一些源代码:
<强>的hello.c 强>
#include <stdio.h>
void hello(void)
{
puts("Hello world");
}
交叉编译:
$ x86_64-w64-mingw32-gcc-win32 -o hello.obj -c hello.c
制作静态库:
$ ar rcs hello.lib hello.obj
然后一个将与hello.lib
链接的程序:
<强>的main.c 强>
extern void hello(void);
int main(void)
{
hello();
return 0;
}
现在我们跳进一个Windows 10 VM,我们正在查看我们的文件 刚刚通过共享文件夹创建:
E:\develop\so\xstatlib>dir
Volume in drive E is VBOX_imk
Volume Serial Number is 0000-0804
Directory of E:\develop\so\xstatlib
03/12/2017 18:37 72 main.c
03/12/2017 18:29 978 hello.lib
03/12/2017 18:26 66 hello.c
03/12/2017 18:27 832 hello.obj
4 File(s) 1,948 bytes
0 Dir(s) 153,282,871,296 bytes free
编译并链接我们的程序:
E:\develop\so\xstatlib>cl /Fehello.exe main.c hello.lib
Microsoft (R) C/C++ Optimizing Compiler Version 19.11.25547 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
main.c
Microsoft (R) Incremental Linker Version 14.11.25547.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:hello.exe
main.obj
hello.lib
运行它:
E:\develop\so\xstatlib>hello
Hello world