1

TL;DR(预期与真实)

对于 Cygwin 的构建ffmpeg,我正在安装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/ffmpeg/bin 正确的链接结束,而不是$HOME/programs/ffmpeg/ffmpeg_build/bin

  2. 构建/链接器/任何东西会为ffmpeg构建解决问题吗?

不管第2题的答案,我都想知道第1题的答案。我以前没有用过flags cmake-DVAR=var我想借此机会学习一下。

结果:

用双大括号括起来的东西是{{ 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_sourcesdir,我展示了被双括号包围的 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. 我正在关注koohiimaster 的旧指南已存档)。那个指南说,

[W]e 不针对 windows 进行交叉编译;我们正在为 Cygwin 编译。

这个 2014 指南没有我想要的所有编解码器 - 我想要尽可能完整的构建 - 所以我也一直在参考这个 ffmpeg-for-Ubuntu 指南已存档),我希望它保持最新-日期。这是koohiimaster提到的。

此外,作为检查我是否获得了我想要的所有编解码器的一种方式,我一直在查看SuperUser 的这个 FFmpeg for Windows 指南

我将在下面给出我的步骤的基础知识。更多详细信息以及所有输出位于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

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让我担心的是输出的最后一部分(实际上是最后一行) 。这是整个输出 - 它不是很长。

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

而不是输出最后一行给出的路径,

/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 ...

在我看来,.configure脚本ffmpeg找不到x265可执行文件,因为它不在bindir.

我将重复我之前的两部分问题:

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

我在这里寻找的是类似于's中的--bindir标志的东西。make./confiure

  1. 构建/链接器/任何东西会为ffmpeg构建解决问题吗?

不管第2题的答案,我都想知道第1题的答案。我以前没有用过flags cmake-DVAR=var我想借此机会学习一下。


我看过的地方和尝试过的东西

我首先从manpage 和--helpfor开始cmake。那太可怕了。我希望我能在这些东西周围找到一些有用的CMAKE_INSTALL_PREFIX东西,但我不知道该怎么做。

我尝试grepcmake --help-full(在我搜索的任何内容之前和之后都有 50 行),但被复杂性绊倒了。我以前只使用过基本cmake的东西,而且我迷失了很多。

即使有--help,我也不知道是否需要查看 、help-manualhelp-commandhelp-modulehelp-policyhelp-variable其他东西。

在我看来,在阅读中,“二进制目录”是“构建”的顶部,而我认为这将是名为的目录bin......我不知道该人打算使用什么东西创建包而不是由我尝试从命令行制作/构建包。

我浏览了似乎是cmakewiki 的有用变量页面已归档)以及cmake.org 上的这个线程已归档),其中,连同这个 SO 源这个这个以及这个这个SO 源,似乎建议使用该CMAKE_RUNTIME_OUTPUT_DIRECTORY变量(因为该EXECUTABLE_OUTPUT-DIRECTORY变量已被它取代)。顺便说一句,我不知道包的创建者和包的消费者应该使用哪些东西——消费者就是我。我试过了

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
4

2 回答 2

1

在 $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"
于 2020-05-05T19:56:51.367 回答
0

与@Philippe 非常接近

@Philippe 的回答让我指出了正确的方向。我对那个答案的评论,有一些变化表明它离我有多近。

这很有帮助 - 与

-DCMAKE_INSTALL_PREFIX="$HOME/programs/ffmpeg"

我一路走过make install。这样做,我最终非常接近。make install输出的最后一部分是

-- 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 构建想要他们在那里。

最后一段描述了原始问题的期望输出。换句话说,为了清楚起见,我希望输出的最后几行是

-- 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. 克隆的文件已经设置为允许bin从命令行更改“*.exe”文件的位置(在所需的任何目录内)。库 ( lib) 文件也是如此。我没有对头文件( ) 文件的位置进行硬编码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输出的最后几行是

-- 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
于 2020-05-11T23:13:40.713 回答