LinuxまたはMacosでWindows用の静的ライブラリをコンパイルする方法を探しています。 これ のようなWindows用の.aライブラリを生成するクロスコンパイラがあるようですが、それは私が望むものではなく、私が望むものですWindows用、できればVisualStudio用の.lib静的ライブラリファイルです。 Windows仮想マシンを実行してVisualStudioを使用できることは知っていますが、それは重すぎて、コマンドラインで実行できません。
UNIXライクなOS(Linux、MacOSなど)の場合、静的ライブラリはオブジェクトファイルの ar
アーカイブ を意味します。 ar
はGNU汎用アーカイバです。アーカイブにどのような種類のファイルを貼り付けるかは関係ありません。「静的ライブラリ」と呼ぶのは習慣です。それらはたまたまオブジェクトファイルです。また、ar
アーカイブが*.a
と呼ばれるのも習慣です。*.lib
などと呼ぶことができます。
Visual Studioの場合、静的ライブラリは、通常Microsoftツールによって作成されるPE形式のオブジェクトファイルのアーカイブを意味します LIB
。
Microsoft LIBアーカイブの形式は、実際にはUnix ar
アーカイブの形式と同じです。マイクロソフトはずっと前にそれを採用したばかりです。
したがって、ディストリビューションのPEクロスコンパイラを使用してLinux上でいくつかのPEオブジェクトファイルをコンパイルし、それらをar
を使用して*.lib
にアーカイブすると、Windowsで使用するのに適した静的ライブラリが得られます。 VisualStudioコンパイラ。
そうですね、それらのオブジェクトファイルが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
にリンクされるプログラム:
main.c
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