2017-12-03 141 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