web-dev-qa-db-ja.com

LinuxまたはMacosでWindows用の静的.libライブラリをコンパイルする方法

LinuxまたはMacosでWindows用の静的ライブラリをコンパイルする方法を探しています。 これ のようなWindows用の.aライブラリを生成するクロスコンパイラがあるようですが、それは私が望むものではなく、私が望むものですWindows用、できればVisualStudio用の.lib静的ライブラリファイルです。 Windows仮想マシンを実行してVisualStudioを使用できることは知っていますが、それは重すぎて、コマンドラインで実行できません。

8
Ryan

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
11
Mike Kinghan