Wie kompilieren Sie die statische .lib-Bibliothek für Windows-in Linux-oder Macos

Ich bin auf der Suche, Weg, um kompilieren Sie die statische Bibliothek für Windows, Linux oder Macos scheint es einen cross-compiler zu generieren .eine Bibliothek für Windows wie diese eine, aber das ist nicht das, was ich will, was ich will, ist eine .lib statische Bibliothek für Windows, vorzugsweise für Visual Studio. Ich weiß, ich kann das ausführen einer virtuellen Maschine mit Windows und mit Visual Studio, aber das ist zu schwer, und kann nicht getan werden in der Befehlszeile.

InformationsquelleAutor Ryan | 2017-12-03



One Reply
  1. 6

    Unter unix-artigen Betriebssysteme (Linux, MacOS, etc) ein statische Bibliothek bedeutet
    ein ar Archiv von Objekt-Dateien. ar ist die GNU general
    Zweck archiver. Es ist nicht egal, welche Art von Dateien, die Sie stick in ein Archiv. Es ist
    nur die Gewohnheit, es zu nennen „statische Bibliothek“, wenn Sie geschehen, um Objekt-Dateien. Und
    es ist auch nur eine custom für ein ar Archiv aufgerufen werden *.a. Sie können es nennen,
    *.lib oder nichts.

    Für Visual Studio, einem statische Bibliothek bedeutet ein Archiv, das PE-format-object-Dateien
    in der Regel erstellt durch das Microsoft-tool LIB.

    Format einer Microsoft-LIB-Archiv ist in der Tat die gleiche wie die eines Unix – ar Archiv. Microsoft
    nur nahm er, vor langer Zeit.

    Also, wenn Sie kompilieren einige PE-Objekt-Dateien unter Linux mit Ihrer Distribution PE-cross-compiler
    dann archivieren Sie Sie in ein *.lib mit ar, hast du eine statische Bibliothek, die gut zu gehen in Windows
    mit den Visual Studio-compiler.

    Gut, Sie haben so lange, wie diese object-Dateien C binären Schnittstellen.
    Wenn keiner von Ihnen haben C++ – Schnittstellen, Sie sind nutzlos: die Microsoft-und GCC-C++ – Compiler verwenden verschiedene name-mangling-Protokolle und sonst ABI-inkompatibel.

    Demo

    Wir starten in linux mit einigen source-code für die statische Bibliothek:

    Hallo.c

    #include <stdio.h>
    
    void hello(void)
    {
        puts("Hello world");
    }

    Cross-kompilieren:

    $ x86_64-w64-mingw32-gcc-win32 -o hello.obj -c hello.c

    Stellen Sie die statische Bibliothek:

    $ ar rcs hello.lib hello.obj

    Dann ein Programm, dass alles verknüpft werden mit hello.lib:

    main.c

    extern void hello(void);
    
    int main(void)
    {
        hello();
        return 0;
    }

    Nun hüpfen wir in ein Windows 10 VM, wo wir sehen das die Dateien, die wir haben
    erstellt einfach über einen freigegebenen Ordner:

    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

    Kompilieren und verknüpfen unser Programm:

    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

    Ausführen:

    E:\develop\so\xstatlib>hello
    Hello world
    • Was extern "C"? Hilft das mit gcc/VisualStudio Kompatibilität in Bezug auf C++ name mangling?
    • Ja, in der Tat, obwohl natürlich der APIs im Rahmen der extern "C" gültig sein muss, C-APIs, um mit zu beginnen. Ich habe die Formulierung genauer.
    • Vielen Dank für diese detaillierte Erklärung und Beispiel, sehr geschätzt.
    • Was ist das Gegenteil? Erzeugen einer statischen Bibliothek, die macOS gültig in Windows?
    • Du meinst diese Frage. Sie können einfach erstellen Sie Linux-Binärdateien (mit MSVC. MSVC generiert Microsoft-PE/COFF-format Binärdateien. Linux-binaries sind ELF-format. Kreide und Käse. Sie können nur bauen, ELF-binaries, die auf Windows, indem Sie cross-kompilieren in eine Unix-artige Umgebung unter Windows, oder durch den Bau in einer Linux-VM oder WSL. Die Antwort oben beschreibt cross-kompilieren von Linux -> Windows.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.