TL; DR (с ожидаемым и реальным)
Для сборки Cygwin ffmpeg
я устанавливаю x265
, и мне кажется, что исполняемый файл оказывается не в том месте . Я покажу базовую структуру каталогов c, а затем покажу результаты 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
?
Я хочу знать ответ на вопрос номер 1 независимо от ответа на вопрос номер 2. Я раньше не использовал 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> ))
.
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 ))
ТЕПЕРЬ, ПОДРОБНЕЕ
Что я делаю
Я работаю над сборкой Cygwin (а не сборкой Windows / mingw) ffmpeg
. Я следую более старому руководству koohiimaster ( в архиве ). В этом руководстве говорится:
[W] e не выполняет кросс-компиляцию для Windows; мы компилируем для Cygwin.
В этом руководстве 2014 года нет всех кодеков, которые мне нужны - я хочу максимально полную сборку - поэтому я также имел в виду это ffmpeg-for-Ubuntu руководство ( в архиве ), которое, я надеюсь, постоянно обновляется. Об этом говорит koohiimaster.
Кроме того, чтобы убедиться, что я получаю все нужные кодеки, я просмотрел это FFmpeg для Windows руководство от SuperUser
Я дам основные шаги ниже. Более подробная информация, а также весь вывод находятся на 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 / EXE в моем каталоге Cygwin root, т.е. 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
at
home/me/programs/ffmpeg/bin/x265.exe
, а не путь, указанный в последней строке вывода,
/home/me/programs/ffmpeg/ffmpeg_build/bin/x265.exe
Меня это беспокоит, особенно потому, что первая часть команды ffmpeg
install что мои инструкции сообщают мне о запуске:
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
?
Я ищу что-то похожее на флаг --bindir
из make
./confiure
.
Сможет ли сборка / компоновщик / что-то выяснить для сборки
ffmpeg
?
Я хочу знать ответ на вопрос номер 1 независимо от ответа на вопрос номер 2. Я не знаю Раньше не использовал cmake
с флагами -DVAR=var
, и я хотел бы воспользоваться этой возможностью, чтобы научиться.
Где я смотрел и что пробовал
Сначала я начал со страницы man
и --help
для cmake
. Это было страшно. Я надеялся, что найду что-нибудь полезное в материалах CMAKE_INSTALL_PREFIX
, но не знал, что с этим делать.
Я пробовал grep
через cmake --help-full
(с 50 строками до и после того, что я искал), но запутался из-за сложности. Раньше я использовал только базовые c cmake
вещи, и я многое потерял.
Даже с --help
, я не знаю, нужно ли мне смотреть на help-manual
, help-command
, help-module
, help-policy
, help-variable
или что-то другое.
При чтении мне показалось, что «двоичный каталог» - это верх «сборки», тогда как я думал, что это будет каталог с именем bin
... Я не мог сказать, что вещи предназначались для использования человеком, создающим пакет, а не мной, который пытается создать / собрать пакет из командной строки.
Я просмотрел то, что казалось cmake
вики Страница полезных переменных ( в архиве ), а также в в этой ветке на cmake.org ( в архиве ), которая вместе с этот источник SO и this и this и this и this источники 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