我正在尋找在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. 從Linux/Windows編譯爲Mac
- 3. 如何編譯靜態庫? (「-static-lib ...」等效?)
- 4. 用預編譯的靜態庫編譯
- 5. 從Linux爲Windows開發交叉編譯靜態庫
- 6. 如何用靜態庫編譯gcc?
- 7. 靜態庫中斷編譯
- 8. 在makefile創建靜態庫,使用Linux G ++編譯器
- 9. 將Mac OS X SpriteKit應用程序編譯爲Windows或Linux
- 10. 在Linux上使用GtkD,我如何靜態鏈接編譯的庫?
- 11. 在英特爾編譯用於Linux的Windows上的C++庫
- 12. 適用於Mac或Linux的.NET反編譯器
- 13. 如何將Haskell編譯爲靜態庫?
- 14. 如何將nana編譯成靜態庫
- 15. 如何在Linux上靜態編譯SDL2和GLEW應用程序?
- 16. QT靜態庫靜態編譯
- 17. 如何檢查LIB(靜態或動態)是專爲iPhone模擬器或Mac OSX
- 18. 在Visual Studio 2013中編譯靜態庫
- 19. iOS:編譯靜態庫
- 20. 寫在Windows上,編譯於MAC
- 21. 編譯使用OpenMP的iOS靜態庫
- 22. 編譯exe文件中的靜態庫
- 23. 如何編譯靜態gdbserver
- 24. 如何靜態編譯X11?
- 25. 如何編譯靜態collectd?
- 26. 如何在Linux下編譯Windows?
- 27. 如何使用VS2010靜態編譯Windows上的SDL遊戲
- 28. 如何編譯從C++(或本機c)從Linux到Windows編寫的庫?
- 29. 如何鏈接靜態庫在Linux
- 30. 編譯針對靜態或動態庫的C++鏈接
'extern「C」'怎麼樣?這有助於與gcc/VisualStudio兼容的C++名稱修改? –
@BarmakShemirani確實,雖然'extern「C」'範圍內的API必須是有效的,開頭的C API必須是 。我已經使措辭更準確。 –
非常感謝你這麼詳細的解釋和例子,非常感謝。 – Ryan