问题
I am searching way to compile static library for Windows in Linux or Macos, there seems to be cross compiler to generate .a library for Windows like this one, but that is not what I want, what I want is a .lib static library file for Windows, preferably for Visual Studio. I know I can run a Windows virtual machine and using Visual Studio, but that is too heavy, and can't be done in command line.
回答1:
For unix-like OSes (Linux, MacOS, etc) a static library means
an ar archive of object files. ar
is the GNU general
purpose archiver. It doesn't care what kind of files you stick into an archive. It's
just the custom to call it "a static library" when they happen to be object files. And
it's also just a custom for an ar
archive to be called *.a
. You can call it
*.lib
, or anything.
For Visual Studio, a static library means an archive of PE-format object files usually created by the Microsoft tool LIB.
The format of an Microsoft LIB archive is in fact the same as that of a Unix ar
archive. Microsoft
just adopted it, long long ago.
So if you compile some PE object files on Linux using your distro's PE cross-compiler
then archive them into a *.lib
with ar
, you've got yourself a static library that's good to go in Windows
with the Visual Studio compiler.
Well, you have as long as those object files have C binary interfaces. If any of them have C++ interfaces, they're useless: the Microsoft and GCC C++ compilers use different name-mangling protocols and are otherwise ABI incompatible.
Demo
We start in linux with some source code for the static library:
hello.c
#include <stdio.h>
void hello(void)
{
puts("Hello world");
}
Cross-compile:
$ x86_64-w64-mingw32-gcc-win32 -o hello.obj -c hello.c
Make the static library:
$ ar rcs hello.lib hello.obj
Then a program that's going to be linked with hello.lib
:
main.c
extern void hello(void);
int main(void)
{
hello();
return 0;
}
Now we hop into a Windows 10 VM where we're looking at the the files we've just created through a shared folder:
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
Compile and link our program:
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
Run it:
E:\develop\so\xstatlib>hello
Hello world
来源:https://stackoverflow.com/questions/47614835/how-to-compile-static-lib-library-for-windows-in-linux-or-macos