我正在寻找在Linux或Mac中为Windows编译静态库的方式,似乎有交叉编译器为Windows生成.a库,如this one,但那是不是我想要的,我想要的是针对Windows的.lib静态库文件,最好是Visual Studio。我知道我可以运行Windows虚拟机并使用Visual Studio,但这太重了,无法在命令行中完成。如何在Linux或Mac中编译用于Windows的静态.lib库
1
A
回答
1
类Unix操作系统(Linux操作系统,MacOS的,等等)一个静态库装置 对象文件的ar
archive。 ar
是GNU通用 的目的归档器。它并不关心你保存在档案中的文件类型。当它们碰巧是目标文件时,它只是将其称为“静态库”的自定义的 。而 它也只是一个ar
存档的定制,称为*.a
。你可以称它为 *.lib
,或其他任何东西。
对于Visual Studio,一个静态库指的通常是由微软工具LIB
创建PE格式的对象文件 存档。
Microsoft LIB存档的格式实际上与Unix ar
存档的格式相同。微软 刚刚通过它,很久以前。
所以,如果你使用你的发行版的PE交叉编译 然后再将其归档编译Linux上的一些PE目标文件与ar
一个*.lib
,你也得为自己的静态库,是很好的在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
链接:
为主。ç
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
相关问题
- 1. 如何编译Windows的静态Taglib库?
- 2. 用预编译的静态库编译
- 3. 从Linux为Windows开发交叉编译静态库
- 4. 如何用静态库编译gcc?
- 5. 在makefile创建静态库,使用Linux G ++编译器
- 6. 将Mac OS X SpriteKit应用程序编译为Windows或Linux
- 7. 在英特尔编译用于Linux的Windows上的C++库
- 8. 适用于Mac或Linux的.NET反编译器
- 9. 如何在Linux上静态编译SDL2和GLEW应用程序?
- 10. 如何将Haskell编译为静态库?
- 11. 如何将nana编译成静态库
- 12. QT静态库静态编译
- 13. 如何检查LIB(静态或动态)是专为iPhone模拟器或Mac OSX
- 14. 编译exe文件中的静态库
- 15. 如何静态编译X11?
- 16. 如何编译静态gdbserver
- 17. 如何在Linux下编译Windows?
- 18. 编译针对静态或动态库的C++链接
- 19. 如何在linux上为JNI应用程序编译动态库?
- 20. 编译静态库内的静态库 - 问题
- 21. GCC如何编译引用静态库的应用程序
- 22. 如何使用依赖于另一个静态库的静态库进行编译
- 23. 在Linux内核中使用静态库
- 24. 编译libgssapi_krb5.a用于Centos 6的静态库6
- 25. C#用于C++的包装器,但只编译为静态库
- 26. 使用Windows编译器之间的编译库编译器,cygwin和linux g ++
- 27. 在windows和linux上编译
- 28. 如何在linux上编译CFugue库?
- 29. 如何使用静态库编译OpenCV应用程序
- 30. 如何使用C++静态库编译C#应用程序?
'extern“C”'怎么样?这有助于与gcc/VisualStudio兼容的C++名称修改? –
@BarmakShemirani确实,虽然'extern“C”'范围内的API必须是有效的,开头的C API必须是 。我已经使措辞更准确。 –
非常感谢你这么详细的解释和例子,非常感谢。 – Ryan