Wie kompiliert man etwas unter Windows?



  • Manchmal wundert es mich, dass das manche Leute schon mal hinbekommen haben.

    Aber egal, ich versuche libarchive für MinGW zu kompilieren. Die build instructions sind leider nutzlos, weil veraltet.

    Unter Linux lässt es sich hiermit kompilieren:
    cmake "-DCMAKE_BUILD_TYPE:STRING=Release"

    Der für Windows beschriebene Weg über CMake-GUI-Dings bringt nichts, aber ich kam mit der Kommandozeile so weit:
    cmake -G "MinGW Makefiles" "-DCMAKE_BUILD_TYPE:STRING=Release" "-DCMAKE_C_COMPILER:STRING=gcc" "-DCMAKE_RC_COMPILER:STRING=windres" "-DCMAKE_MAKE_PROGRAM:STRING=make"

    Ich hab mich schon gefreut, weil nun immerhin der übliche configure-Satz von "checking support for..:" kommt, aber danach lügt er:
    `-- Configuring done

    You have changed variables that require your cache to be deleted.

    Configure will be re-run and you may have to reset some variables.

    The following variables have changed:

    CMAKE_RC_COMPILER= windres

    CMake Error: CMake was unable to find a build program corresponding to "MinGW Makefiles". CMAKE_MAKE_PROGRAM is not set. You probably need to select a differe

    nt build tool.

    CMake Error: CMake was unable to find a build program corresponding to "MinGW Makefiles". CMAKE_MAKE_PROGRAM is not set. You probably need to select a differe

    nt build tool.

    CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.

    Missing variable is:

    CMAKE_C_COMPILER_ENV_VAR

    CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.

    Missing variable is:

    CMAKE_C_COMPILER

    CMake Error: Could not find cmake module file: C:/src/libarchive-3.1.2/CMakeFiles/2.8.12.1/CMakeCCompiler.cmake

    CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage

    -- Configuring incomplete, errors occurred!`

    Alternativ mit mitgeliefertem configure-Skript versucht:

    `bash-3.1$ ./configure

    [...]

    bash-3.1$ make

    cat ./libarchive/test/test_*.c | grep DEFINE_TEST > libarchive/test/list.h

    cat ./tar/test/test_*.c | grep DEFINE_TEST > tar/test/list.h

    cat ./cpio/test/test_*.c | grep DEFINE_TEST > cpio/test/list.h

    make all-am

    make[1]: Entering directory `C:/src/libarchive-3.1.2'

    process_begin: CreateProcess(NULL, /bin/mkdir -p libarchive, ...) failed.

    make (e=2): Das System kann die angegebene Datei nicht finden.

    make[1]: *** [libarchive/.dirstamp] Error 2

    make[1]: Leaving directory `C:/src/libarchive-3.1.2'

    make: *** [all] Error 2`

    Was jetzt?

    Ich verwende diese MinGW-Distro (Version 10.4, weils die letzte 32-bit-Version ist):
    http://nuwen.net/mingw.html



  • Ah, habs nun mit TDM MinGW versucht und da funktioniert es, wenn man die Extraparameter weg lässt:
    `cmake -G "MinGW Makefiles"

    mingw32-make`

    Keine Ahnung wo jetzt der Unterschied zwischen den beiden MinGW-Distributionen ist, aber ich bleibe dann erstmal bei TDM, auch wenn da nicht so viele Bibliotheken und keine Zusatzprogramme wie bash und git mitgeliefert werden.
    Besser weniger Features als kaputte Features.



  • Ich habs sogar geschafft, lzma, bz2 und zlib statisch mit einzukompilieren und das Produkt funktioniert sogar ohne bei der ersten Verwendung gleich abzustürzen. Eindeutig ein neuer Meilenstein für die Entwicklung auf Windows, zumindest was open source-Bibliotheken und Toolchains angeht. Insgesamt also trotz allem ein erfolgreicher letzter Tag des Jahres.

    Auch interessant ist, dass meine Programmgröße mit TDM MinGW von 260 KB auf 150 KB gesunken ist, obwohl die C++-Runtime in beiden Fällen statisch gelinkt wird.
    Zwar verwenden beide Distros GCC 4.8.1, aber irgendwo gibt es offenbar doch noch größere Unterschiede.



  • Zu früh gelobt, libarchive dekomprimiert die Hälfte der Dateien in RAR-Archiven erst gar nicht.
    "Parsing filters is unsupported". Na dann, Prost.



  • Ich würde hier eher was mit dem MS - C++ Compiler oder wenigstens mit dem Watcom Compiler unter Windows arbeiten, um sich (und anderen) nicht völlig unnötige Problemchen einzuhandeln.



  • Wenn man aber C will, bringt einen ein C++-Compiler nicht viel weiter. Und der Watcom ist doch auch nur noch im Lebenserhaltungsmodus und nichtmal jemand fixt die vorhandenen Bugs.

    Zum Problem mit den RAR-Dateien: wenn ich mich nicht irre, unterstützt die RAR-Implementierung in libarchive zwar auch die neueren Formatversionen, ist aber noch ziemlich experimentell. Von Rarlabs selbst gibt es auch noch eine Unrar-Implementierung im Sourcecode[1], allerdings nicht unter einer OSS-Lizenz.

    Um bequem Windows-Binarys zu erstellen würde ich übrigens auf den Einsatz von Windows verzichten. Cross-Compiling unter Linux ist mittlerweile viel bequemer. 😉

    yum install mingw{32,64}-libarchive # oder -static
    x86_64-w64-mingw32-gcc deincode.c -larchive
    -> a.exe (evtl. plus DLL) auf Windows-Maschine schieben
    

    [1] http://www.rarlab.com/rar/unrarsrc-5.0.14.tar.gz


Anmelden zum Antworten