簡體   English   中英

cmake 在 Cygwin 上為 ffmpeg 安裝 x265 - 可執行位置不同於其他編解碼器

[英]cmake installation of x265 for ffmpeg on Cygwin - executable location different from other codecs

TL;DR(預期與真實)

對於ffmpeg的 Cygwin 構建,我正在安裝x265 ,在我看來,可執行文件最終出現在錯誤的位置。 我將展示一些基本的目錄結構,然后我將展示預期和真實的tree輸出,在cmake安裝之前和之后。 對於我認為這很重要的目錄,我將顯示cmake安裝前后的輸出。

我的問題有兩個部分。 我使用了以下cmakemake命令,

# pwd => $HOME/programs/ffmpeg/ffmpeg_sources/x265/build/linux
PATH="$HOME/programs/ffmpeg/bin:$PATH" \
  cmake -G "Unix Makefiles" \
        -DCMAKE_INSTALL_PREFIX="$HOME/programs/ffmpeg/ffmpeg_build" \
        -DENABLE_SHARED=OFF \
        -DCMAKE_EXE_LINKER_FLAGS="-static" 
            ../../source
PATH="$HOME/programs/ffmpeg/bin:$PATH" make -j $(nproc)
make install

結果如下,我的真實與預期,並且有一個更詳細、更明確、希望更清晰的文件,其中包含pastebin.com/86wHrtxR上的信息。 現在,對於我的兩部分問題:

  1. 如何更改我的cmake命令,以便我的x265.exe文件以正確的鏈接結束,而不是 $HOME/programs $HOME/programs/ffmpeg/bin $HOME/programs/ffmpeg/ffmpeg_build/bin

  2. ffmpeg構建的構建/鏈接器/任何東西都可以解決嗎?

無論問題2的答案如何,我都想知道問題1的答案。我之前沒有使用過帶有cmake -DVAR=var標志的cmake,我想借此機會學習。

結果:

用雙花括號括起來的東西是{{ expected }}

雙尖括號包圍的東西是<< real >> ,即安裝完成后它們存在。

如果實際匹配預期,並且文件/目錄是新的,我用雙括號括起來,即雙圓括號。 (( match ))

如果某些東西不是新的(因此前后相同),我沒有標記它。

   me@MACHINE ~/programs/ffmpeg
   $ tree --charset=ascii bin
   bin
   |-- lame.exe
   |-- mp3rtp.exe
   |-- mp3x.exe
   `-- x264.exe
{{ `-- x265.exe                     }} ## Expected, not Exists

   me@MACHINE ~/programs/ffmpeg
   $ tree --charset=ascii \
                   ffmpeg_build
   ffmpeg_build
<< |-- bin                          >> ## Not expected, Exists
<< |   `-- x265.exe                 >> ## Not expected, Exists
   |-- include
   |   |-- fdk-aac
   |   |   |-- aacdecoder_lib.h
   |   |   |-- aacenc_lib.h
   |   |   `-- ... <more .h files>
   |   |-- lame
   |   |   `-- lame.h
   |   |-- x264.h
   |   `-- x264_config.h
(( |   |-- x265.h                   )) ## Expected and Exists
(( |   `-- x265_config.h            )) ## Expected and Exists
   |-- lib
   |   |-- libfdk-aac.a
   |   |-- libfdk-aac.la
   |   |-- libmp3lame.a
   |   |-- libmp3lame.la
(( |   |-- libx265.a                )) ## Expected and Exists
   |   `-- pkgconfig
   |       |-- fdk-aac.pc
   |       `-- x264.pc
(( |       `-- x265.pc              )) ## Expected and Exists
   `-- share
       |-- doc
       |   ... <only lame>
       `-- man
           ... <only lame>

有關構建目錄結構的其他可能有用的信息。

me@MACHINE ~/programs/ffmpeg
$ tree --charset=ascii -L 1 .
.
|-- bin
|-- ffmpeg_build
`-- ffmpeg_sources

3 directories, 0 files

對於接下來的ffmpeg_sources目錄,我將顯示被雙括號包圍的 after(既是預期的,也是真實的/存在的),即雙圓括號(( <after> ))

   me@MACHINE ~/programs/ffmpeg
   $ tree --charset=ascii -L 1 ffmpeg_sources
   ffmpeg_sources
   |-- fdk-aac.zip
   |-- lame-svn
   |-- mstorsjo-fdk-aac-e7d8591
   |-- x264-snapshot-20191217-2245
   |-- x264-snapshot-20191217-2245.tar.bz2
   `-- x264-snapshot-20191218-README.txt
(( `-- x265                         ))

   3 directories, 3 files
(( 4 directories, 3 files ))

現在,更多細節


我在做什么

我正在研究ffmpeg的 Cygwin 構建(與 Windows/mingw 構建相比)。 我正在關注koohiimaster 的舊指南已存檔)。 那個指南說,

[W]e 不對 windows 進行交叉編譯; 我們正在為 Cygwin 編譯。

這個 2014 指南沒有我想要的所有編解碼器 - 我想要盡可能完整的構建 - 所以我也一直在參考這個 ffmpeg-for-Ubuntu 指南已存檔),我希望它保持最新-日期。 這是koohiimaster提到的。

另外,作為檢查我是否獲得了我想要的所有編解碼器的一種方式,我一直在查看來自 SuperUser 的 FFmpeg 的 Windows 指南

我將在下面給出我的步驟的基礎知識。 更多詳細信息以及所有 output 位於pastebin.com/suL1nU6Z

查看構建的目錄結構

me@MACHINE ~/programs/ffmpeg
$ cd $HOME/programs/ffmpeg

me@MACHINE ~/programs/ffmpeg
$ tree --charset=ascii -d -L 1
.
|-- bin
|-- ffmpeg_build
`-- ffmpeg_sources

3 directories

獲取源。 請注意,我必須apt-cyg install mercurial (在我的 Cygwin 根目錄中使用我的 Cygwin 設置 GUI/EXE,即C:\cygwin64\setup-x86_64.exe /setup-x86_64.exe install -q -P mercurial ,我也可以完成 /setup-x /setup-x86_64.exe install -q -P mercurial

cd ffmpeg_sources
hg clone https://bitbucket.org/multicoreware/x265

運行cmakemake命令

cd x265/build/linux
PATH="$HOME/programs/ffmpeg/bin:$PATH" \
  cmake -G "Unix Makefiles" \
        -DCMAKE_INSTALL_PREFIX="$HOME/programs/ffmpeg/ffmpeg_build" \
        -DENABLE_SHARED=OFF \
        -DCMAKE_EXE_LINKER_FLAGS="-static" \
            ../../source
PATH="$HOME/programs/ffmpeg/bin:$PATH" make -j $(nproc)
make install

讓我擔心的是make install output 的最后一部分(實際上是最后一行)。 這是整個 output - 它不是很長。

make[1]: Entering directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
make[2]: Entering directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
make[2]: Leaving directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
[ 20%] Built target encoder
make[2]: Entering directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
make[2]: Leaving directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
[ 83%] Built target common
make[2]: Entering directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
make[2]: Leaving directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
[ 84%] Built target x265-static
make[2]: Entering directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
make[2]: Leaving directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
[100%] Built target cli
make[1]: Leaving directory '/home/me/programs/ffmpeg/ffmpeg_sources/x265/build/linux'
Install the project...
-- Install configuration: "Release"
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/lib/libx265.a
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/include/x265.h
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/include/x265_config.h
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/lib/pkgconfig/x265.pc
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/bin/x265.exe

正如TL;DR部分中所討論的,我希望看到x265.exe

home/me/programs/ffmpeg/bin/x265.exe

而不是output最后一行給出的路徑,

/home/me/programs/ffmpeg/ffmpeg_build/bin/x265.exe

這讓我特別擔心,因為我的指令告訴我運行的ffmpeg安裝命令的第一部分是

PATH="$HOME/programs/ffmpeg/bin:$PATH" \
PKG_CONFIG_PATH="$HOME/programs/ffmpeg/ffmpeg_build/lib/pkgconfig" \
  ./configure \
    --prefix="$HOME/programs/ffmpeg/ffmpeg_build" \
    --extra-cflags="-I$HOME/programs/ffmpeg/ffmpeg_build/include" \
    --extra-ldflags="-L$HOME/programs/ffmpeg/ffmpeg_build/lib" \
    --bindir="$HOME/programs/ffmpeg/bin" \

... and on it goes...

在我看來, ffmpeg.configure腳本找不到x265可執行文件,因為它不在bindir中。

我將重復我之前的兩部分問題:

  1. 如何更改我的cmake命令,以便我的x265.exe文件以正確的鏈接結束,而不是 $HOME/programs $HOME/programs/ffmpeg/bin $HOME/programs/ffmpeg/ffmpeg_build/bin

我在這里尋找的是類似於make./confiure中的--bindir標志的東西。

  1. ffmpeg構建的構建/鏈接器/任何東西都可以解決嗎?

無論問題2的答案如何,我都想知道問題1的答案。我之前沒有使用過帶有cmake -DVAR=var標志的cmake,我想借此機會學習。


我看過的地方和嘗試過的東西

我首先從man頁和cmake--help開始。 那太可怕了。 我希望我能在CMAKE_INSTALL_PREFIX東西周圍找到一些有用的東西,但我不知道該怎么做。

我通過 cmake --help-full 嘗試了grep cmake --help-full (在我搜索的任何內容之前和之后都有 50 行),但被復雜性絆倒了。 我以前只使用過基本cmake東西,而且我有點迷失了。

即使使用--help ,我也不知道是否需要查看help-manualhelp-commandhelp-modulehelp-policyhelp-variable或其他內容。

在我看來,在閱讀中,“二進制目錄”是“構建”的頂部,而我認為它是名為bin的目錄......我不知道什么東西打算被創建 package 的人而不是我,他試圖從命令行制作/構建 package。

我查看了似乎是cmake wiki 的有用變量頁面已存檔),以及在 cmake.org 上的此線程已存檔),其中,連同此 SO 源以及以及SO 源,似乎建議使用CMAKE_RUNTIME_OUTPUT_DIRECTORY變量(因為EXECUTABLE_OUTPUT-DIRECTORY變量已被它取代)。 順便說一句,我不知道 package 的創建者和 package 的消費者應該使用哪些東西——消費者就是我。 我試過了

PATH="$HOME/programs/ffmpeg/bin:$PATH" \
  cmake -G "Unix Makefiles" \
        -DCMAKE_INSTALL_PREFIX="$HOME/programs/ffmpeg/ffmpeg_build" \
        -DCMAKE_RUNTIME_OUTPUT_DIRECTORY="$HOME/programs/ffmpeg/bin" \
        -DENABLE_SHARED=OFF \
        -DCMAKE_EXE_LINKER_FLAGS="-static" 
            ../../source
PATH="$HOME/

並且已經考慮了五十個左右的其他 -DVAR 變量,但是我嘗試過的任何一個,我仍然得到相同的結果。 我仍然在似乎錯誤的地方獲得可執行文件。


系統詳情

$ date && date +'%s'
Tue, May  5, 2020 11:14:40 AM
1588698880
$ uname -a
CYGWIN_NT-10.0 MACHINE 3.1.4(0.340/5/3) 2020-02-19 08:49 x86_64 Cygwin
$ cmake --version
cmake version 3.14.5

CMake suite maintained and supported by Kitware (kitware.com/cmake).
$ bash --version | head -n 1
GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin)
$ gcc --version | head -n 1
gcc (GCC) 9.3.0
$ g++ --version | head -n 1
g++ (GCC) 9.3.0
$ make --version | head -n 2
GNU Make 4.3
Built for x86_64-pc-cygwin

在 $HOME/programs/ffmpeg/bin 中有 x286.exe 文件

    --prefix="$HOME/programs/ffmpeg" \
    --extra-cflags="-I$HOME/programs/ffmpeg/include" \
    --extra-ldflags="-L$HOME/programs/ffmpeg/lib" \

對於 cmake:

-DCMAKE_INSTALL_PREFIX="$HOME/programs/ffmpeg"

與@Philippe 非常接近

@Philippe 的回答讓我指出了正確的方向。 我對那個答案的評論,有一些變化表明它離我有多近。

這很有幫助 - 與

-DCMAKE_INSTALL_PREFIX="$HOME/programs/ffmpeg"

我一直通過make install 這樣做,我最終非常接近。 make install output 的最后一部分是

-- Installing: /home/me/programs/ffmpeg/lib/libx265.a
-- Installing: /home/me/programs/ffmpeg/include/x265.h
-- Installing: /home/me/programs/ffmpeg/include/x265_config.h
-- Installing: /home/me/programs/ffmpeg/lib/pkgconfig/x265.pc
-- Installing: /home/me/programs/ffmpeg/bin/x265.exe

x265.exe 是我想要的位置,但現在其他五個文件( libx265.ax265.hx265_config.hx265.pc )似乎不在其他安裝模式想要的位置,例如,我想要/home/me/programs/ffmpeg/ffmpeg_build/lib/libx265.a - 似乎最終的 ffmpeg 構建希望它們在那里。

最后一段描述了原始問題中所需的 output。 換句話說,為了清楚起見,我希望 output 的最后幾行是

-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/lib/libx265.a
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/include/x265.h
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/include/x265_config.h
-- Installing: /home/me/programs/ffmpeg/ffmpeg_build/lib/pkgconfig/x265.pc
-- Installing: /home/me/programs/ffmpeg/bin/x265.exe

匹配“所需輸出”的答案

@Philippe 的答案中的想法組合讓我到達了我需要的地方。 首先,需要對CMakeLists.txt進行一些小改動。 克隆的文件已經設置為允許從命令行更改“*.exe”文件的位置(在所需的任何bin目錄內)。 庫 ( lib ) 文件也是如此。 我沒有對 header ( include ) 文件的位置進行硬編碼,而是進行了此更改。

me@MACHINE ~/programs/ffmpeg/ffmpeg_sources/x265/source
$ cp CMakeLists.txt CMakeLists.txt.$(date +'%s').bak

me@MACHINE ~/programs/ffmpeg/ffmpeg_sources/x265/source
$ cat -n CMakeLists.txt.1588732600.bak | head -n 386 | tail -16   ### BEFORE
   371
   372  # Build options
   373  set(LIB_INSTALL_DIR lib CACHE STRING "Install location of libraries")
   374  set(BIN_INSTALL_DIR bin CACHE STRING "Install location of executables")
   375  set(EXTRA_LIB "" CACHE STRING "Extra libraries to link against")
   376  set(EXTRA_LINK_FLAGS "" CACHE STRING "Extra link flags")
   377  if(EXTRA_LINK_FLAGS)
   378      list(APPEND LINKER_OPTIONS ${EXTRA_LINK_FLAGS})
   379  endif()
   380  if(EXTRA_LIB)
   381      option(LINKED_8BIT  "8bit libx265 is being linked with this library" OFF)
   382      option(LINKED_10BIT "10bit libx265 is being linked with this library" OFF)
   383      option(LINKED_12BIT "12bit libx265 is being linked with this library" OFF)
   384  endif(EXTRA_LIB)
   385  mark_as_advanced(EXTRA_LIB EXTRA_LINK_FLAGS)
   386

me@MACHINE ~/programs/ffmpeg/ffmpeg_sources/x265/source
$ vim CMakeLists.txt   ### Making the change

me@MACHINE ~/programs/ffmpeg/ffmpeg_sources/x265/source
$ cat -n CMakeLists.txt | head -n 389 | tail -19   ### AFTER
   371
   372  # Build options
   373  set(LIB_INSTALL_DIR lib CACHE STRING "Install location of libraries")
   374  set(BIN_INSTALL_DIR bin CACHE STRING "Install location of executables")
   375  # Start DWB insert 2020-05-05
   376  set(INCLUDE_INSTALL_DIR include CACHE STRING "Install location of headers")
   377  #   End DWB insert 2020-05-05
   378  set(EXTRA_LIB "" CACHE STRING "Extra libraries to link against")
   379  set(EXTRA_LINK_FLAGS "" CACHE STRING "Extra link flags")
   380  if(EXTRA_LINK_FLAGS)
   381      list(APPEND LINKER_OPTIONS ${EXTRA_LINK_FLAGS})
   382  endif()
   383  if(EXTRA_LIB)
   384      option(LINKED_8BIT  "8bit libx265 is being linked with this library" OFF)
   385      option(LINKED_10BIT "10bit libx265 is being linked with this library" OFF)
   386      option(LINKED_12BIT "12bit libx265 is being linked with this library" OFF)
   387  endif(EXTRA_LIB)
   388  mark_as_advanced(EXTRA_LIB EXTRA_LINK_FLAGS)
   389

通過diff看到

me@MACHINE ~/programs/ffmpeg/ffmpeg_sources/x265/source
$ diff CMakeLists.txt CMakeLists.txt.1588732600.bak
375,377d374
< # Start DWB insert 2020-05-05
< set(INCLUDE_INSTALL_DIR include CACHE STRING "Install location of headers")
< #   End DWB insert 2020-05-05
599,604c596,597

下一個變化:

me@MACHINE ~/programs/ffmpeg/ffmpeg_sources/x265/source
$ cat -n CMakeLists.txt.1588732600.bak | head -n 602 | tail -9   ### BEFORE
   594
   595  if(SVTHEVC_FOUND)
   596      install(FILES "${SVT_HEVC_INCLUDE_DIR}/EbApi.h" DESTINATION include)
   597      install(FILES "${SVT_HEVC_INCLUDE_DIR}/EbErrorCodes.h" DESTINATION include)
   598      install(FILES "${SVT_HEVC_LIBRARY}" DESTINATION ${LIB_INSTALL_DIR})
   599  endif()
   600
   601  install(FILES x265.h "${PROJECT_BINARY_DIR}/x265_config.h" DESTINATION include)
   602  if((WIN32 AND ENABLE_CLI) OR (WIN32 AND ENABLE_SHARED))

me@MACHINE ~/programs/ffmpeg/ffmpeg_sources/x265/source
$ vim CMakeLists.txt   ### Making the change

me@MACHINE ~/programs/ffmpeg/ffmpeg_sources/x265/source
$ cat -n CMakeLists.txt | head -n 611 | tail -15   ### AFTER
   597
   598  if(SVTHEVC_FOUND)
   599      # DWB change 2020-05-05, original is next (cmt) line, new is the line after
   600      #install(FILES "${SVT_HEVC_INCLUDE_DIR}/EbApi.h" DESTINATION include)
   601      install(FILES "${SVT_HEVC_INCLUDE_DIR}/EbApi.h" DESTINATION ${INCLUDE_INSTALL_DIR})
   602      # DWB change 2020-05-05, original is next (cmt) line, new is the line after
   603      #install(FILES "${SVT_HEVC_INCLUDE_DIR}/EbErrorCodes.h" DESTINATION include)
   604      install(FILES "${SVT_HEVC_INCLUDE_DIR}/EbErrorCodes.h" DESTINATION ${INCLUDE_INSTALL_DIR})
   605      install(FILES "${SVT_HEVC_LIBRARY}" DESTINATION ${LIB_INSTALL_DIR})
   606  endif()
   607
   608  # DWB change 2020-05-05, original is next (comment) line, new is the line after
   609  #install(FILES x265.h "${PROJECT_BINARY_DIR}/x265_config.h" DESTINATION include)
   610  install(FILES x265.h "${PROJECT_BINARY_DIR}/x265_config.h" DESTINATION ${INCLUDE_INSTALL_DIR})
   611  if((WIN32 AND ENABLE_CLI) OR (WIN32 AND ENABLE_SHARED))

或者,再次通過diff看到(已進行了兩項更改),

me@MACHINE ~/programs/ffmpeg/ffmpeg_sources/x265/source
$ diff CMakeLists.txt CMakeLists.txt.1588732600.bak
375,377d374
< # Start DWB insert 2020-05-05
< set(INCLUDE_INSTALL_DIR include CACHE STRING "Install location of headers")
< #   End DWB insert 2020-05-05
599,604c596,597
<     # DWB change 2020-05-05, original is next (cmt) line, new is the line after
<     #install(FILES "${SVT_HEVC_INCLUDE_DIR}/EbApi.h" DESTINATION include)
<     install(FILES "${SVT_HEVC_INCLUDE_DIR}/EbApi.h" DESTINATION ${INCLUDE_INSTALL_DIR})
<     # DWB change 2020-05-05, original is next (cmt) line, new is the line after
<     #install(FILES "${SVT_HEVC_INCLUDE_DIR}/EbErrorCodes.h" DESTINATION include)
<     install(FILES "${SVT_HEVC_INCLUDE_DIR}/EbErrorCodes.h" DESTINATION ${INCLUDE_INSTALL_DIR})
---
>     install(FILES "${SVT_HEVC_INCLUDE_DIR}/EbApi.h" DESTINATION include)
>     install(FILES "${SVT_HEVC_INCLUDE_DIR}/EbErrorCodes.h" DESTINATION include)
608,610c601
< # DWB change 2020-05-05, original is next (comment) line, new is the line after
< #install(FILES x265.h "${PROJECT_BINARY_DIR}/x265_config.h" DESTINATION include)
< install(FILES x265.h "${PROJECT_BINARY_DIR}/x265_config.h" DESTINATION ${INCLUDE_INSTALL_DIR})
---
> install(FILES x265.h "${PROJECT_BINARY_DIR}/x265_config.h" DESTINATION include)

`cmake` 命令和 `make` 命令

讓我們進入正確的構建目錄並運行cmake

cd $HOME/programs/ffmpeg/ffmpeg_sources/x265/build/linux

PATH="$HOME/programs/ffmpeg/bin:$PATH" \
  cmake -G "Unix Makefiles" \
        -DCMAKE_INSTALL_PREFIX="$HOME/programs/ffmpeg" \
        -DBIN_INSTALL_DIR="bin" \
        -DLIB_INSTALL_DIR="ffmpeg_build/lib" \
        -DINCLUDE_INSTALL_DIR="ffmpeg_build/include" \
        -DENABLE_SHARED=OFF \
        -DCMAKE_EXE_LINKER_FLAGS="-static" \
            ../../source

這給出了一些我們不需要擔心的棄用警告。 現在,對於make零件。

PATH="$HOME/programs/ffmpeg/bin:$PATH" make -j $(nproc)

make install

這導致了預期的結果。 make install output 的最后幾行是

-- Installing: /home/13852/programs/ffmpeg/ffmpeg_build/lib/libx265.a
-- Installing: /home/13852/programs/ffmpeg/ffmpeg_build/include/x265.h
-- Installing: /home/13852/programs/ffmpeg/ffmpeg_build/include/x265_config.h
-- Installing: /home/13852/programs/ffmpeg/ffmpeg_build/lib/pkgconfig/x265.pc
-- Installing: /home/13852/programs/ffmpeg/bin/x265.exe

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM