[英]cmake installation of x265 for ffmpeg on Cygwin - executable location different from other codecs
對於ffmpeg
的 Cygwin 構建,我正在安裝x265
,在我看來,可執行文件最終出現在錯誤的位置。 我將展示一些基本的目錄結構,然后我將展示預期和真實的tree
輸出,在cmake
安裝之前和之后。 對於我認為這很重要的目錄,我將顯示cmake
安裝前后的輸出。
我的問題有兩個部分。 我使用了以下cmake
並make
命令,
# 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上的信息。 現在,對於我的兩部分問題:
如何更改我的cmake
命令,以便我的x265.exe
文件以正確的鏈接結束,而不是 $HOME/programs $HOME/programs/ffmpeg/bin
$HOME/programs/ffmpeg/ffmpeg_build/bin
?
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
運行cmake
並make
命令
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
中。
我將重復我之前的兩部分問題:
cmake
命令,以便我的x265.exe
文件以正確的鏈接結束,而不是 $HOME/programs $HOME/programs/ffmpeg/bin
$HOME/programs/ffmpeg/ffmpeg_build/bin
? 我在這里尋找的是類似於make
的./confiure
中的--bindir
標志的東西。
ffmpeg
構建的構建/鏈接器/任何東西都可以解決嗎? 無論問題2的答案如何,我都想知道問題1的答案。我之前沒有使用過帶有cmake
-DVAR=var
標志的cmake,我想借此機會學習。
我首先從man
頁和cmake
的--help
開始。 那太可怕了。 我希望我能在CMAKE_INSTALL_PREFIX
東西周圍找到一些有用的東西,但我不知道該怎么做。
我通過 cmake --help-full 嘗試了grep
cmake --help-full
(在我搜索的任何內容之前和之后都有 50 行),但被復雜性絆倒了。 我以前只使用過基本cmake
東西,而且我有點迷失了。
即使使用--help
,我也不知道是否需要查看help-manual
、 help-command
、 help-module
、 help-policy
、 help-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 的回答讓我指出了正確的方向。 我對那個答案的評論,有一些變化表明它離我有多近。
這很有幫助 - 與
-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.a
、x265.h
、x265_config.h
和x265.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
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.