Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 696
Ryan Avatar asked Dec 03 '17 02:12

Ryan


1 Answers

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
like image 67
Mike Kinghan Avatar answered Nov 17 '22 20:11

Mike Kinghan