How to compile static .lib library for Windows in Linux or Macos

可紊 提交于 2020-05-26 12:04:10

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!