2017-12-03 372 views
1

我正在寻找在Linux或Mac中为Windows编译静态库的方式,似乎有交叉编译器为Windows生成.a库,如this one,但那是不是我想要的,我想要的是针对Windows的.lib静态库文件,最好是Visual Studio。我知道我可以运行Windows虚拟机并使用Visual Studio,但这太重了,无法在命令行中完成。如何在Linux或Mac中编译用于Windows的静态.lib库

回答

1

类Unix操作系统(Linux操作系统,MacOS的,等等)一个静态库装置 对象文件的ar archivear是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 
+0

'extern“C”'怎么样?这有助于与gcc/VisualStudio兼容的C++名称修改? –

+1

@BarmakShemirani确实,虽然'extern“C”'范围内的API必须是有效的,开头的C API必须是 。我已经使措辞更准确。 –

+0

非常感谢你这么详细的解释和例子,非常感谢。 – Ryan