TL;DR(预期与真实)
对于 Cygwin 的构建ffmpeg
,我正在安装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/ffmpeg/bin
正确的链接结束,而不是$HOME/programs/ffmpeg/ffmpeg_build/bin
?构建/链接器/任何东西会为
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_sources
dir,我展示了被双括号包围的 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
运行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
让我担心的是输出的最后一部分(实际上是最后一行) 。这是整个输出 - 它不是很长。
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
.
我将重复我之前的两部分问题:
- 如何更改我的
cmake
命令,以便我的x265.exe
文件以$HOME/programs/ffmpeg/bin
正确的链接结束,而不是$HOME/programs/ffmpeg/ffmpeg_build/bin
?
我在这里寻找的是类似于's中的--bindir
标志的东西。make
./confiure
- 构建/链接器/任何东西会为
ffmpeg
构建解决问题吗?
不管第2题的答案,我都想知道第1题的答案。我以前没有用过flags cmake
,-DVAR=var
我想借此机会学习一下。
我看过的地方和尝试过的东西
我首先从man
page 和--help
for开始cmake
。那太可怕了。我希望我能在这些东西周围找到一些有用的CMAKE_INSTALL_PREFIX
东西,但我不知道该怎么做。
我尝试grep
过cmake --help-full
(在我搜索的任何内容之前和之后都有 50 行),但被复杂性绊倒了。我以前只使用过基本cmake
的东西,而且我迷失了很多。
即使有--help
,我也不知道是否需要查看 、help-manual
、help-command
、help-module
、help-policy
或help-variable
其他东西。
在我看来,在阅读中,“二进制目录”是“构建”的顶部,而我认为这将是名为的目录bin
......我不知道该人打算使用什么东西创建包而不是由我尝试从命令行制作/构建包。
我浏览了似乎是cmake
wiki 的有用变量页面(已归档)以及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