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
    1. 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
    1. 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
    1. -- 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
    1. cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=toolchain-x86_64-w64-mingw32.cmake ../../source


    wenn man die dll nicht braucht dann geht auch:

    Code
    1. 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
    1. 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
    1. 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
    1. x265 [info]: HEVC encoder version 0.9+125-84d31cb2aeab
    2. x265 [info]: build info [Windows][GCC 4.8.2][64 bit] 8bpp
    3. 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
    1. 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
    1. x265.exe --version
    2. x265 [info]: HEVC encoder version 0.9+128-a25fb61a7326
    3. x265 [info]: build info [Windows][GCC 4.6.3][64 bit] 16bpp
    4. 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
    1. 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)

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


    Kurz gesagt, wenn man das:

    Code
    1. SET(CMAKE_SYSTEM_NAME Windows)
    2. SET(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
    3. SET(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
    4. SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)
    5. SET(CMAKE_ASM_YASM_COMPILER yasm)
    6. SET(CMAKE_CXX_FLAGS "-static-libgcc -static-libstdc++ -static -O3 -s")
    7. SET(CMAKE_C_FLAGS "-static-libgcc -static-libstdc++ -static -O3 -s")
    8. SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "-static-libgcc -static-libstdc++ -static -O3 -s")
    9. 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
    1. [100%] Building CXX object CMakeFiles/cli.dir/x265.cpp.obj
    2. Linking CXX executable x265.exe
    3. libx265.a: could not read symbols: Archive has no index; run ranlib to add one
    4. collect2: ld returned 1 exit status
    5. make[2]: *** [x265.exe] Fehler 1
    6. make[1]: *** [CMakeFiles/cli.dir/all] Fehler 2
    7. 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
    1. /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
    1. Package mingw64-winpthreads-3.1.999-0.7.trunk.gitec1ff7.20140730.el7.noarch already installed and latest version


    Jemand 'ne Idee ?