x265 auf debian für Windows bauen

  • Hi zusammen.

    Ich versuche die hg Version von x265 auf meiner Debian Kiste für Windows zu kompilieren.
    Laut Beschreibung soll's so gehen:

    Code
    cmake -G "MSYS Makefiles" -DHIGH_BIT_DEPTH=1 ../../source -DENABLE_SHARED:BOOLEAN=OFF -DCMAKE_CXX_FLAGS="$CXXFLAGS -static-libgcc" -DCMAKE_C_FLAGS="$CFLAGS -static-libgcc"

    nur ich bekomme immer die Fehlermeldung:

    Code
    CMake Error: Could not create named generator MSYS Makefiles

    Leider habe ich darüber mal so gar nix in Google & Co darüber gefunden :mad:
    Läßt man "MSYS Makefiles" weg, so wird die Linux Variante gebaut ...

    Jemand 'ne Idee

  • Du brauchst ein cross compiler environment zb. "mingw-w64".

    In manches Distros ist das in den Paketquellen zu finden, oder man baut sich das selbst zb. von hier.
    Kompiliert wird dann mit dem Konfigurationszusatz "--cross-prefix=i686-w64-mingw32-".

    Hier ist das ganze an FFmpeg etwas genauer beschrieben. Prinzipiell sollte sich diese Vorgehensweise auf x265 übertragen lassen.

    MP4.tool - GUI für Mp4Box und L-Smash
    BeHappy [ 1 ][ 2 ]- AviSynth basierter Audiokonverter mit DSP- und Encoder-Plugins
    PGFEnc - PGF (ProgressiveGraphicsFile) und WebP Encoder und Decoder

  • Hi Jones1913: Das Problem hier ist: es gibt kein configure dem man das übergeben kann ...
    Das MinGW-W64 Paket(e) habe ich installiert, aber die Fehlermeldung ist immer noch da ...
    Kann man das bei -DCMAKE_CXX_FLAGS="$CXXFLAGS ... übergeben ?

  • Stimmt, hab jetzt auch gesehen, daß x265 cmake verwendet.

    Da ich mich zur Zeit für meinen neuen stromspar-PC wieder mal mit Linux beschäftige hat mich das jetzt auch mal interressiert.

    Die Prozedur ist sogar im x265 Wiki beschrieben.
    Also entweder die cross-Parameter per Konfigurationsdatei übergeben oder in der Kommandozeile.

    Dummerweise führt die beschriebene Vorgehensweise bei mir immer zu folgender Fehlermeldung:

    Code
    -- cmake version 2.8.12.2-- The C compiler identification is GNU 4.8.2-- The CXX compiler identification is GNU 4.8.2-- Check for working C compiler: /usr/bin/i686-w64-mingw32-gcc-- Check for working C compiler: /usr/bin/i686-w64-mingw32-gcc -- brokenCMake Error at /usr/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:61 (message):  The C compiler "/usr/bin/i686-w64-mingw32-gcc" is not able to compile a  simple test program.  It fails with the following output:  /usr/bin/i686-w64-mingw32-gcc  CMakeFiles/cmTryCompileExec1890825961.dir/testCCompiler.c.obj -o  cmTryCompileExec1890825961 -rdynamic  i686-w64-mingw32-gcc: Fehler: nicht erkannte Kommandozeilenoption  »-rdynamic«

    Keine Ahnung ob es an der 32bit mingw Version liegt...

    Ich hab dann einfach die "toolchain-x86_64-w64-mingw32.cmake" aus "x265/build/msys" nach "x265/build/linux"
    kopiert und dann hats so funktioniert:

    Code
    cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=toolchain-x86_64-w64-mingw32.cmake ../../source


    wenn man die dll nicht braucht dann geht auch:

    Code
    cmake -G "Unix Makefiles" -DENABLE_SHARED:BOOLEAN=OFF -DCMAKE_CXX_FLAGS="$CXXFLAGS -static-libgcc" -DCMAKE_C_FLAGS="$CFLAGS -static-libgcc" -DCMAKE_TOOLCHAIN_FILE=toolchain-x86_64-w64-mingw32.cmake ../../source

    Ein kurzer Versuch die .exe unter Windows zu starten scheiterte aber kläglich mit "unable to load libgcc-1.dll" oder so ähnlich.
    Wahrscheinlich stimmt da noch was nicht mit den cmake Parametern.

    MP4.tool - GUI für Mp4Box und L-Smash
    BeHappy [ 1 ][ 2 ]- AviSynth basierter Audiokonverter mit DSP- und Encoder-Plugins
    PGFEnc - PGF (ProgressiveGraphicsFile) und WebP Encoder und Decoder

  • Die option "static-libgcc" war das Problem, mit nur "-static" funktioniert es.
    Komischerweise funktioniert es nur mit Konfigurationsdatei, wenn ich die ganzen Parameter an der bash mit übergebe schlägt das ganze immer fehl ... egal.

    Also so gehts bei mir:

    Code
    cmake -G "Unix Makefiles" -DENABLE_SHARED:BOOLEAN=OFF -DCMAKE_CXX_FLAGS="$CXXFLAGS -static" -DCMAKE_C_FLAGS="$CFLAGS -static" -DCMAKE_TOOLCHAIN_FILE=toolchain-x86_64-w64-mingw32.cmake ../../source

    "toolchain-x86_64-w64-mingw32.cmake" in "x265/build/linux" :

    Code
    SET(CMAKE_SYSTEM_NAME Windows)SET(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)SET(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)SET(CMAKE_RANLIB x86_64-w64-mingw32-ranlib)SET(CMAKE_ASM_YASM_COMPILER yasm)

    Die .exe ist zwar knapp 9MB groß, aber lässt sich starten. Müsste vieleicht noch komprimiert werden oder so...

    Code
    x265 [info]: HEVC encoder version 0.9+125-84d31cb2aeab
    x265 [info]: build info [Windows][GCC 4.8.2][64 bit] 8bpp
    x265 [info]: using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX XOP FMA4 FMA3 LZCNT BMI1

    *Hüstel* Funktions- und Speedtests stehen übrigens noch aus :D

  • Auf jeden Fall kann man die EXE strippen. Es gibt für die verschiedenen Zielformate (Win32 / Win64) aber verschiedene "strip.exe"-Varianten in einer MSYS-Installation, also vermute ich, dass auch in einer Linux-Crosscompile-Umgebung da Varianten existieren könnten, die jeweils nur bestimmte Ausgabeformate strippen können.

  • Hi,

    hat geklappt :D

    Code
    root@debian:/work/x265/build/msys# cmake -G "Unix Makefiles" -DENABLE_SHARED:BOOLEAN=OFF -DHIGH_BIT_DEPTH:BOOL=ON -DCMAKE_CXX_FLAGS="$CXXFLAGS -static" -DCMAKE_C_FLAGS="$CFLAGS -static" -DCMAKE_TOOLCHAIN_FILE=toolchain-x86_64-w64-mingw32.cmake ../../source
    Code
    x265.exe --version
    x265 [info]: HEVC encoder version 0.9+128-a25fb61a7326
    x265 [info]: build info [Windows][GCC 4.6.3][64 bit] 16bpp
    x265 [info]: using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.1 Cache64

    Ich weiß jetzt nicht ob unter Linux das stripping standart-mäßig aktiviert ist, aber es scheint so. Die EXE hat 4.104.979 bytes ... (4MB)

  • Dachte strippen ist schon im Buildprozess mit drin, wieder was gelernt. :rock:
    32bit Version bauen funktioniert jetzt auch, ka was da anfangs alles schiefgelaufen ist.
    Lohnt sich aber fast gar nicht mehr, kriegt man ja schon an jeder Ecke hinterhergeschmissen die builds (sogar meine Mutter kompiliert den Kram schon :highly_amused: ).

    Übrigens:

    Code
    strip --strip-all x265.exe && upx -9 -v -k --brute x265.exe


    603.648 Bytes (64bit)

    Wer bietet weniger? :D:D:D

    MP4.tool - GUI für Mp4Box und L-Smash
    BeHappy [ 1 ][ 2 ]- AviSynth basierter Audiokonverter mit DSP- und Encoder-Plugins
    PGFEnc - PGF (ProgressiveGraphicsFile) und WebP Encoder und Decoder

  • Hm, ich bekomme:

    ... jemand 'ne Idee warum ? :huh:

  • Ok, mit der neusten Version von UPX klappts :)

    wow ... mittlerweile sind wir bei x265 Version 1.0 angekommen

    Binary ist jetzt: 551.936 bytes (64 Bit)

    Edited once, last by may24 (May 3, 2014 at 12:51 PM).

  • Die Angaben im x265 wiki wurden inzwischen etwas präzisiert.

    Kurz gesagt, wenn man das:

    Code
    SET(CMAKE_SYSTEM_NAME Windows)
    SET(CMAKE_C_COMPILER   x86_64-w64-mingw32-gcc)
    SET(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
    SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)
    SET(CMAKE_ASM_YASM_COMPILER yasm)
    SET(CMAKE_CXX_FLAGS "-static-libgcc -static-libstdc++ -static -O3 -s")
    SET(CMAKE_C_FLAGS "-static-libgcc -static-libstdc++ -static -O3 -s")
    SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "-static-libgcc -static-libstdc++ -static -O3 -s")
    SET(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "-static-libgcc -static-libstdc++ -static -O3 -s")


    in die cmake Konfigurationsdatei schreibt bekommt man eine fertig statisch gelinkte und gestrippte .exe serviert.

    Der make Aufruf verkürzt sich damit drastisch auf:

    cmake -DCMAKE_TOOLCHAIN_FILE=config-file.cmake ../../source


    Hach, wenn doch nur alles so einfach wäre... :ani_lol:

    MP4.tool - GUI für Mp4Box und L-Smash
    BeHappy [ 1 ][ 2 ]- AviSynth basierter Audiokonverter mit DSP- und Encoder-Plugins
    PGFEnc - PGF (ProgressiveGraphicsFile) und WebP Encoder und Decoder

  • Hm ... ich mußte mein System neu aufsetzen und bekomme nun Fehler:

    Code
    [100%] Building CXX object CMakeFiles/cli.dir/x265.cpp.obj
    Linking CXX executable x265.exe
    libx265.a: could not read symbols: Archive has no index; run ranlib to add one
    collect2: ld returned 1 exit status
    make[2]: *** [x265.exe] Fehler 1
    make[1]: *** [CMakeFiles/cli.dir/all] Fehler 2
    make: *** [all] Fehler 2

    Jemand 'ne Idee warum ?

  • Un wieder mal geht's nicht.
    Na ja ... auf meiner Debian Büchse schon ... Aber nicht auf CentOS 7:

    Code
    /bin/x86_64-w64-mingw32-g++ -Wl,--whole-archive  CMakeFiles/cmTryCompileExec3618985467.dir/objects.a -Wl,--no-whole-archive  -o cmTryCompileExec3618985467.exe  -Wl,--out-implib,libcmTryCompileExec3618985467.dll.a  -Wl,--major-image-version,0,--minor-image-version,0 -static-libgcc  -static-libstdc++ -static -O3 -s -lkernel32 -luser32 -lgdi32 -lwinspool  -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32  /usr/lib/gcc/x86_64-w64-mingw32/4.9.1/../../../../x86_64-w64-mingw32/bin/ld:  cannot find -lpthread  collect2: error: ld returned 1 exit status  gmake[1]: Leaving directory `/work/x265/build/msys/CMakeFiles/CMakeTmp'  gmake[1]: *** [cmTryCompileExec3618985467.exe] Error 1  gmake: *** [cmTryCompileExec3618985467/fast] Error 2

    Aber WARUM ??? :ratlos:

    Code
    Package mingw64-winpthreads-3.1.999-0.7.trunk.gitec1ff7.20140730.el7.noarch already installed and latest version

    Jemand 'ne Idee ?

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!