FFmpeg(w32threads版)のビルド手順です。
MSYSとMinGWから準備する方は、1、2番の記事からお読みください。
MSYSとMinGWの準備ができている方は、3番の記事からお読みください。
1. MSYS環境のアップデート2. MinGW環境のアップデートFFmpegのDirectShow(dshow)を有効にするためには、mingwrtとw32apiの代わりに、MinGW-w64が必要です。
MinGW-w64を自分でビルドしてみたい方は、こちらを参考にしてください。
MinGW-w64のビルド (v3.1.0以降)MinGW-w64を自分でビルドするのが面倒という方は、以下の記事を参照してください。
現在は、mingw-w64-v3系がメインですが、以下の記事では、mingw-w64-v1系をインストールします。
MinGW-w64 for win32 のインストールFFmpegのconfigureと、その他のライブラリのconfigureでもpkg-configが必要なものがありますので、インストールしておいてください。
pkg-configのインストール3. 個別のライブラリについて以下のライブラリは、あらかじめインストールしておいてください。
この記事を書いた時点より新しくなっているものもありますので、それぞれの記事で確認してください。
あまり使用しないライブラリもありますので、必要なライブラリだけインストールして、それをconfigureオプションでenableにすれば良いです。
2016/03/25 追記個別のライブラリに、Kvazaar HEVC encoderと、XZ Utilsを追加しました。
rev.78199(e07e88c)以降、libvo-aacencはサポートされなくなりました。
nasm-2.11yasm-1.2.0zlib-1.2.8bzip2-1.0.6libbluray-0.5.0libcaca-0.99.beta18libcdio-0.92libcdio-paranoia-10.2+0.90+1game-music-emu-0.6.0gsm-1.0.13libilbc-1.1.1kvazaarlibmodplug-0.8.8.4lame-3.99.5OpenH264openjpeg-1.5.1opus-1.1opencore-amr-0.1.3vid.stab-0.98vo-aacenc-0.1.3vo-amrwbenc-0.1.3libogg-1.3.1aoTuV Beta6.03 (libvorbis-1.3.4パッチ)libtheora-1.1.1speex-1.2rc1twolame-0.3.13libsoxr-0.1.1libvpx-v1.3.0wavpack-4.70.0libwebp-0.4.0x264 (make fprofiled)x265xvidcore-1.4xz-5.2.2PolarSSLを使用する場合は、以下の記事を参照してください。
当サイトでは、PolarSSLを使用しています。polarssl-1.3.4rtmpdump-2.4 PolarSSL版GnuTLSを、PolarSSLの代わりに使用する場合は、以下の記事を参照してください。
当サイトでは、以前はPolarSSLを使用していましたが、2015/08/16以降、GnuTLSを使用しています。
gmp-6.1.0gnutls-3.4.10rtmpdump-2.4 GnuTLS版OpenSSLを使用する場合は、以下の記事を参照してください。
OpenSSLはGPL非互換なので、GnuTLSかPolarSSLをおすすめします。
openssl-1.0.1frtmpdump-2.4字幕ファイルを読み込むためのライブラリlibassを追加する場合は、以下のライブラリが必要になります。
pkg-config_0.28-1_win32libiconv-1.14freetype-2.5.2expat-2.1.0fontconfig-2.11.0fribidi-0.19.6libass-0.10.2FFplayをビルドする場合は、SDLが必要になります。
デフォルトでffplayはenableになっていますので、configureオプションに「--disable-ffplay」がある場合は削除してください。
SDL-1.2.15SDLをインストールしていると、自動でSDLがenableになります。
SDLをインストールしていてもFFmpegでdisableにしたい場合は、configureオプションに「--disable-outdev=sdl」を追加してください。
「--disable-outdev=sdl」を付けてSDLがdisableになるのはFFmpegだけで、FFplayには影響ありません。
4. FFmpegのビルドFFmpegは、以下の場所にあります。
http://ffmpeg.org/ソースコードはGitで管理されています。
Gitをインストールして、MSYSから、以下のコマンドでソースコードを入手してください。
$ git clone git://source.ffmpeg.org/ffmpeg.git
または、
Get FFmpeg
http://ffmpeg.org/download.htmlExtra repositoriesの、一番上のSnapshotのリンクからソースコードをダウンロードできます。
ファイルは、ffmpeg-HEAD-(Gitハッシュ値).tar.gz という形式になっていますので、そのファイル名に読み替えてください。
ダウンロードしたファイルは、tarで解凍できます。
$ tar xzf ffmpeg-HEAD-9125383.tar.gz
解凍したら、ソースコードのあるディレクトリに移動します。
$ cd ffmpeg-HEAD-9125383
Gitでソースコードをダウンロードした場合は、
$ cd ffmpeg
2012/04/13 以降、makeすると以下のようなエラーが出る場合があります。
library.mak:95: *** missing separator. Stop.
ダウンロード(git clone)済みのソースコードがある場合、一旦Makefileを全部削除して、改行コードをLFにして作成し直せば、エラーが出なくなります。
$ echo 'Makefile eol=lf' >> .gitattributes
$ find ./ -name 'Makefile' -print | xargs rm
$ git checkout -f
次に、configure、その他諸々の一括パッチを適用します。
2018/03/11 追記パッチを更新しました。(rev.90220(69995a94d8)〜)
ffmpeg-20180311.diffFFmpeg rev.37209以降の更新で、「-flags2」で設定していたものが独立したオプションになり、特にx264関連の設定が大幅に変わりました。
以前の「-flags2」の設定も使用できるように、Revert用のパッチを作りましたので、必要であれば適用してください。
2017/11/26 追記「-flags2」用のパッチを更新しました。(rev.88091(c17f638565)〜)
ffmpeg-global_opts-20171126.diff$ patch -p1 < ffmpeg-20180311.diff
$ patch -p1 < ffmpeg-global_opts-20171126.diff
パッチを適用したら、configureを実行します。
2017/10/22 追記configureオプションの「--disable-outdev=sdl」を削除しました。
$ ./configure --enable-gpl --enable-version3 --enable-avisynth --enable-fontconfig --enable-libass --enable-libbluray --enable-libcaca --enable-libcdio --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libilbc --enable-libkvazaar --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-opengl --enable-w32threads --disable-debug --pkg-config-flags=--static --extra-ldflags=-static --extra-cflags="-mtune=athlon64 -mfpmath=sse -msse" --optflags="-O2 -finline-functions"
配布用に、できる限りのライブラリをenableにしていますが、自分用の場合は必要なものだけenableにすれば良いと思います。
FFplay、FFprobeはデフォルトでenableになっていますので、不要な場合は、それぞれ「--disable-ffplay」「--disable-ffprobe」を追加してください。
FFserverは、MinGW環境に実装されていないincludeファイルなどがあり、configureオプションにかかわらずビルドできません。
debug symbolsはgdbなどでデバッグする時に必要になりますが、デバッグすることはほとんどないため「--disable-debug」を付けています。
最適化レベルは、以前は、
--enable-small 有りの場合 -Os
--enable-small 無しの場合 -O3
しか選択できませんでしたが、FFmpeg Git rev.30971(4b87a08)から、
--optflags
というオプションが追加され、最適化レベルを変えられるようになりました。
--enable-small 有りだと、バイナリのサイズは小さくなるが、エンコード速度が落ちる。
--enable-small 無しだと、エンコード速度は速いが、バイナリのサイズがでかくなる。
--enable-small 無しで、--optflags="-O2 -finline-functions" だと、バイナリサイズがあまり大きくならないわりに、--enable-small 無しの場合とエンコード速度が大して変わらない。
ということで、色々試した結果、以下のようにしました。
--enable-small 無し
--optflags="-O2 -finline-functions" 追加
最適化オプションは、PCの環境により以下のようにしています。
最適化無し版のconfigureオプションのみ、「--enable-memalign-hack」を追加しています。
これにより、Windows2000でも使えるようになるらしいです。
※あくまでも一例ですので、もっと凝ってみたい方は、gccのマニュアルなどを見て研究されると良いかもしれません。
最適化無し版
--extra-cflags="-march=i686 -mtune=generic" --enable-memalign-hack
Pentium4最適化版
--extra-cflags="-mtune=pentium4 -mfpmath=sse -msse"
Core2最適化版
--extra-cflags="-mtune=core2 -mfpmath=sse -msse"
Athlon64最適化版
--extra-cflags="-mtune=athlon64 -mfpmath=sse -msse"
Phenom最適化版
--extra-cflags="-mtune=amdfam10 -mfpmath=sse -msse"
FFmpegのconfigureオプションに、
--cpu=athlon64
などど追加すると、そのCPUに特化した最適化が実行されますので、ご自分の環境でしか使用しない場合は、試してみると良いかもしれません。
その他、Core2最適化版、Athlon64最適化版、Phenom最適化版のconfigureオプションに、--cpu=i686 を追加、Pentium4のconfigureオプションに、--cpu=pentium4 を追加しています。
configureの結果に以下のような違いがあります。
・「--cpu」オプション無し
CMOV enabled=no, CMOV is fast=no, EBX available=yes, EBP available=no
・「--cpu=i686」オプション追加
CMOV enabled=
yes, CMOV is fast=
yes, EBX available=yes, EBP available=
yes・「--cpu=pentium4」オプション追加
CMOV enabled=
yes, CMOV is fast=no, EBX available=yes, EBP available=
yes問題なければ、以下のようなメッセージが出ます。
source pathはコンパイル環境により異なります。
思ったよりも時間がかかりますので、気長に待ちましょう。
configureのメッセージを見る
install prefix /usr/local
source path .
C compiler gcc
C library mingw64
ARCH x86 (i686)
big-endian no
runtime cpu detection yes
yasm yes
MMX enabled yes
MMXEXT enabled yes
3DNow! enabled yes
3DNow! extended enabled yes
SSE enabled yes
SSSE3 enabled yes
AVX enabled yes
XOP enabled yes
FMA4 enabled yes
i686 features enabled yes
CMOV is fast yes
EBX available yes
EBP available yes
debug symbols no
strip symbols yes
optimize for size no
optimizations yes
static yes
shared no
postprocessing support yes
new filter support yes
network support yes
threading support w32threads
safe bitstream reader yes
SDL support yes
opencl enabled no
libzvbi enabled no
texi2html enabled no
perl enabled yes
pod2man enabled yes
makeinfo enabled yes
External libraries:
avisynth libmp3lame libvo_aacenc
bzlib libopencore_amrnb libvo_amrwbenc
fontconfig libopencore_amrwb libvorbis
iconv libopenjpeg libvpx
libass libopus libwavpack
libbluray librtmp libwebp
libcaca libsoxr libx264
libcdio libspeex libx265
libfreetype libtheora libxvid
libgme libtwolame opengl
libgsm libvidstab zlib
libmodplug
configureのメッセージを閉じる
(長いので中略)
License: GPL version 3 or later
Creating config.mak, config.h, and doc/config.texi...
その後、
$ make
CPUに余力がある場合は、「-j」でパラレルmakeできます。
3パラの場合は、以下のように指定します。
あまり増やしすぎてもかえって効率が悪くなりますので、CPUによって適当な数値を見つけてください。
$ make -j3
ffmpeg.exe が出来ていれば完了です。
【補足】
自分用の場合は、再配布を考えなくても良いので、
libfaac入りのFFmpegをビルドすることもできます。
現在は、libfaacより音質が良いと評判のfdk-aacがありますので、fdk-aacをおすすめします。
追加で、fdk-aacをコンパイル&インストールします。
fdk-aacのコンパイル&インストールconfigureオプションの適当な所に、
--enable-nonfree
--enable-libfdk-aac
を追加します。
configureメッセージの、External libraries: に
libfdk-aac
が追加されていれば、後はmakeして完了です。
FFmpegのエンコードオプションで、
-acodec libfdk_aac
が使えるようになります。
当サイトで配布しているFFmpegは配布用のため、libfaac、libfdk-aacは無効にしています。
【更新履歴】を見る
2014/02/17 追記
ライブラリの追加など、全面的に書き直しました。
2014/02/24 追記
libx265側でいくつかパラメータ名が変更されたのですが、それに対応した更新がまだありませんので、以下のパッチを適用してください。
ffmpeg-libx265-20140220.diff
$ patch -p1 < ffmpeg-libx265-20140220.diff
2014/02/24 追記
個別のライブラリに、libilbc-1.1.1 を追加しました。
libilbc-1.1.1
2014/02/24 追記
configureオプションに「--enable-libilbc 」を追加しました。
2014/02/25 追記
libx265のパッチは不要になりました。
$ patch -p1 < ffmpeg-libx265-20140220.diff
2014/03/12 追記
パッチを更新しました。(rev.61255(5968415)〜)
ffmpeg-20131221.diff
ffmpeg-20140312.diff
2014/03/13 追記
パッチを更新しました。(rev.61290(3a05d7a)〜)
ffmpeg-20140313.diff
2014/03/28 追記
パッチを更新しました。(rev.61886(64b7914)〜)
ffmpeg-20140328.diff
2014/03/28 追記
「-flags2」用のパッチを更新しました。(rev.61886(64b7914)〜)
ffmpeg-global_opts-20131114.diff
ffmpeg-global_opts-20140328.diff
2014/04/02 追記
「-flags2」用のパッチを更新しました。(rev.62025(a0cf877)〜)
ffmpeg-global_opts-20140402.diff
2014/04/08 追記
libx265側で削除されたパラメータがあるのですが、それに対応した更新がまだありませんので、以下のパッチを適用してください。
ffmpeg-libx265-20140408.diff
$ patch -p1 < ffmpeg-libx265-20140408.diff
2014/04/11 追記
libx265側で削除されたパラメータに対応した更新がありましたので、パッチを削除しました。
$ patch -p1 < ffmpeg-libx265-20140408.diff
2014/05/02 追記
「-flags2」用のパッチを更新しました。(rev.62889(58f4d12)〜)
ffmpeg-global_opts-20140502.diff
2014/07/22 追記
パッチを更新しました。(rev.64845(2c5c7f1)〜)
ffmpeg-20140722.diff
2014/07/22 追記
configureオプションに「--enable-libfribidi」を追加しました。
2014/08/09 追記
「-flags2」用のパッチを更新しました。(rev.65223(9400603)〜)
ffmpeg-global_opts-20140809.diff
2014/08/20 追記
パッチを更新しました。(rev.65452(70b8668)〜)
ffmpeg-20140820.diff
2014/08/20 追記
「-flags2」用のパッチを更新しました。(rev.65721(b0352b1)〜)
ffmpeg-global_opts-20140820.diff
2014/08/29 追記
「-flags2」用のパッチを更新しました。(rev.65721(b0352b1)〜)
libavcodec/version.h を修正しました。
ffmpeg-global_opts-20140829.diff
2014/09/04 追記
パッチを更新しました。(rev.66013(3695278)〜)
ffmpeg-20140904.diff
2014/09/05 追記
パッチを更新しました。(rev.66013(3695278)〜)
ffmpeg-20140905.diff
2014/09/25 追記
パッチを更新しました。(rev.66416(fb01a18)〜)
ffmpeg-20140925.diff
2014/10/03 追記
「-flags2」用のパッチを更新しました。(rev.66574(cdd6f05)〜)
ffmpeg-global_opts-20141003.diff
2014/10/13 追記
「-flags2」用のパッチを更新しました。(rev.66732(923a242)〜)
ffmpeg-global_opts-20141013.diff
2014/11/18 追記
「-flags2」用のパッチを更新しました。(rev.67729(745730c)〜)
ffmpeg-global_opts-20141118.diff
2014/12/12 追記
パッチを更新しました。(rev.68211(4a0b1d9)〜)
ffmpeg-20141212.diff
2014/12/12 追記
.gitattributes へのリダイレクトを、上書きから追記に変更しました。
git stash を git checkout -f に変更しました。
$ echo 'Makefile eol=lf' > .gitattributes
$ echo 'Makefile eol=lf' >> .gitattributes
$ find ./ -name 'Makefile' -print | xargs rm
$ git stash
$ git checkout -f
2015/01/21 追記
パッチを更新しました。(rev.69105(4184d34)〜)
ffmpeg-20150121.diff
2015/01/21 追記
パッチを更新しました。(rev.69105(4184d34)〜)
libavcodec/libopenh264enc.c の修正を追加しました。
ffmpeg-20150121-2.diff
2015/01/22 追記
個別のライブラリに、OpenH264 を追加しました。
OpenH264
2015/01/22 追記
configureオプションに「--enable-libopenh264」「--disable-dxva2」を追加しました。
2015/02/15 追記
パッチを更新しました。(rev.69700(2384933)〜)
ffmpeg-20150215.diff
2015/02/22 追記
パッチを更新しました。(rev.69955(841e9f4)〜)
ffmpeg-20150222.diff
2015/03/01 追記
パッチを更新しました。(rev.70116(0425e16)〜)
ffmpeg-20150301.diff
2015/03/07 追記
パッチを更新しました。(rev.70475(39becc9)〜)
ffmpeg-20150307.diff
2015/05/28 追記
「-flags2」用のパッチを更新しました。(rev.72286(d9b264b)〜)
ffmpeg-global_opts-20150528.diff
2015/07/31 追記
「-flags2」用のパッチを更新しました。(rev.74157(bf2474c)〜)
ffmpeg-global_opts-20150731.diff
2015/08/14 追記
「-flags2」用のパッチを更新しました。(rev.74157(bf2474c)〜)
ffmpeg-global_opts-20150814.diff
2015/08/30 追記
「-flags2」用のパッチを更新しました。(rev.74516(99b9f01)〜)
ffmpeg-global_opts-20150830.diff
2015/09/06 追記
「-flags2」用のパッチを更新しました。(rev.74895(b27ddff)〜)
ffmpeg-global_opts-20150906.diff
2015/09/07 追記
「-flags2」用のパッチを更新しました。(rev.74942(590ea32)〜)
ffmpeg-global_opts-20150907.diff
2015/09/17 追記
「-flags2」用のパッチを更新しました。(rev.75077(309fb6b)〜)
ffmpeg-global_opts-20150917.diff
2016/03/25 追記
パッチを更新しました。(rev.78161(30c1bdb)〜)
ffmpeg-20160325.diff
2016/03/25 追記
「-flags2」用のパッチを更新しました。(rev.78219(b552f3a)〜)
ffmpeg-global_opts-20160325.diff
2016/03/25 追記
OpenH264 v1.6用のパッチを追加しました。
ffmpeg-openh264-1.6.diff
こちらの記事のパッチをまとめたものです。
libavcodec/version.hのパッチは除いています。
http://ffmpeg.org/pipermail/ffmpeg-devel/2016-March/190980.html
http://ffmpeg.org/pipermail/ffmpeg-devel/2016-March/190984.html
http://ffmpeg.org/pipermail/ffmpeg-devel/2016-March/190982.html
$ patch -p1 < ffmpeg-openh264-1.6.diff
2016/03/25 追記
configureオプションに「--enable-libkvazaar」「--pkg-config-flags=--static」を追加しました。
rev.78199(e07e88c)以降、libvo-aacencはサポートされなくなりましたので、「--enable-libvo-aacenc」を削除しました。
2016/03/25 追記
以下の文章を削除、GnuTLSの記事のリンクを修正、GMPを追加しました。
当サイトでは、PolarSSLを使用しています。
GnuTLSを、PolarSSLの代わりに使用する場合は、以下の記事を参照してください。
当サイトでは、以前はPolarSSLを使用していましたが、2015/08/16以降、GnuTLSを使用しています。
gnutls-3.2.11
gmp-6.1.0
gnutls-3.4.10
2016/03/25 追記
個別のライブラリに、Kvazaar HEVC encoderと、XZ Utilsを追加しました。
rev.78199(e07e88c)以降、libvo-aacencはサポートされなくなりました。
kvazaar
xz-5.2.2
2016/04/16 追記
「-flags2」用のパッチを更新しました。(rev.79286(6f69f7a)〜)
ffmpeg-global_opts-20160415.diff
2016/04/16 追記
「-flags2」用のパッチを更新しました。(rev.79460(21acc4d)〜)
ffmpeg-global_opts-20160416.diff
2016/05/26 追記
パッチを更新しました。(rev.79913(96d6160)〜)
make fate(FFmpegのtest)の、エラー対策用に入れていたパッチ部分を削除しました。
make fateは、以下のように実行できます。
make fate CC_C="-c -Umain"
ffmpeg-20160526.diff
2016/05/28 追記
FFmpegのコンパイルというより、ビルドと言うほうがふさわしいため、タイトルなどを修正しました。
FFmpeg(w32threads版)のコンパイル手順です。
FFmpeg(w32threads版)のビルド手順です。
4. FFmpegのコンパイル
4. FFmpegのビルド
2016/06/10 追記
make fateの件は修正されました。
make fateは、以下のように実行できます。
make fate CC_C="-c -Umain"
2016/08/12 追記
OpenH264 v1.6もサポートされましたので、パッチと説明文を削除しました。
http://git.videolan.org/?p=ffmpeg.git;a=commitdiff;h=293676c476733e81d7b596736add6cd510eb6960
2016/08/12 追記
configureオプションの「--disable-dxva2」を削除しました。
--enable-w32threads --disable-dxva2 --disable-debug
2016/09/29 追記
パッチを更新しました。(rev.81760(2134499)〜)
ffmpeg-20160929.diff
2016/12/08 追記
「-flags2」用のパッチを更新しました。(rev.82564(7289aa2d71)〜)
ffmpeg-global_opts-20161208.diff
2017/03/26 追記
パッチを更新しました。(rev.84234(4563a86f01)〜)
ffmpeg-20170326.diff
2017/04/23 追記
パッチを更新しました。(rev.85557(9bf3d84089)〜)
ffmpeg-20170423.diff
2017/10/22 追記
パッチを更新しました。(rev.87641(fd5f4ac081)〜)
ffmpeg-20171022.diff
2017/10/22 追記
「-flags2」用のパッチを更新しました。(rev.88037(417d473bde)〜)
ffmpeg-global_opts-20171022.diff
2017/10/22 追記
configureオプションの「--disable-outdev=sdl」を削除しました。
--enable-opengl --disable-outdev=sdl --enable-w32threads
2017/11/26 追記
「-flags2」用のパッチを更新しました。(rev.88091(c17f638565)〜)
ffmpeg-global_opts-20171126.diff
2018/03/11 追記
パッチを更新しました。(rev.90220(69995a94d8)〜)
ffmpeg-20180311.diff
【更新履歴】を閉じる
昨年に仕上げたffmpegコンパイルガイドですが、アップデートしようかと考えて訪問したところ、ビックリする位更新がありました。
さて、つかぬことをお聞きしますが、ffmpegをconfigureするときに"x265 not found"というエラーで止まってしまうことはありませんか?
こちらでは数十回トライして1回だけはconfigureが通りmakeもできたのですが、残りは全てエラーでした。
Macでffmpegをコンパイルしている人を見つけて確認したところ、その人はうまく行っていたけど、今日再現実験をしたら"x265 not found"が出たそうです。
見当違いでもいいからと考え、現在x265-develのメーリングリストに加入して、問題提起しました。
MinGW環境では、このようなエラーはないのかと思い書き込みました。
「ffmpegとx265をリンクするためには " -lstdc++"がコンパイラフラッグとして必要だが、ffmpegがx265のCFLAGをリクエストする際に、それはpkg-config経由で用意されていない。」
ことが原因でした。
x265.pcを次のように編集すると、問題は解決します。
--- a/x265.pc 2014-04-16 14:50:20.000000000 +0900
+++ b/x265.pc 2014-04-21 10:54:32.000000000 +0900
@@ -6,6 +6,6 @@
Name: x265
Description: H.265/HEVC video encoder
Version: 0.9
-Libs: -L${libdir} -lx265
+Libs: -L${libdir} -lx265 -lstdc++
原因から類推するにMinGW環境でも起こりえるような気がしますが、取りあえず情報までです。
P.S.
x265のパッチはMac(Unix)/MinGWどちらでも適用されるものでしょうか?
お久しぶりです。
pkg-configについて、説明不足でした。
-lstdc++は、x265.pcのLibs.privateセクションに入っています。
Libs.privateを有効にするには、pkg-configのオプションに「--static」を付けて、
pkg-config --libs --static /mingw/lib/pkgconfig/x265.pc
などとしなければいけません。
ffmpegのconfigureの中で、デフォルトでは「--static」が付いていないので、ffmpeg-2014XXXX.diffパッチでconfigureファイルを修正しています。
configureオプションのどこかに、
--pkg-config-flags=--static
と付け加えれば、configureファイルを修正しなくても、同じことができます。
もしかして、Macだと、-lstdc++がLibs.privateにも入っていなかったりするのでしょうか。
x265の方のパッチは、いつまで経っても修正される気配がないので、修正しなくても問題ない箇所なのかもしれません。
管理人さんはffmpegのconfigureスクリプトの方で対応されていたのですね。
x265開発チームと話し合った結果、-lstdc++をLibsに加えるのは正しくないと説明されました。
管理人さんも書かれている通り、--pkg-config-flags=--staticを付け加えろと言われ、これで問題がないことを確認しました。
Mac (llvm) の場合は-lstdc++ではなく-lc++がLibs.privateに入っています。--staticを付け加えることで、これがコンパイラフラグとして呼び出されるようです。
(実のところ、僕はこの辺が良く分かってませんが…。(^ ^;)
あ、そうだ。MacだとLibs.privateにlibclang_rt.osx.aというファイルが絶対パスで記述され、頭に-lがついてリンクされるようになっていますが、これはx265のバグと認定されました。
昨晩mecurialで落とした分から、頭に着いていた-lが削除されていました。
これは、もしかして管理人さんがx265のところでsedコマンドで処理しているリンクする必要のないファイルなのではないかと想像します。
お時間のある時に確認してみてください。
x265のパッチは、うーん。分からない人間が間に入っても何ですもんね。x265-develに参加しているので代わりに投稿してみようかと思ったんですが…。止めておいた方が良いでしょうか?
というのは、おかしいですね。管理人さんの説明されたところまでは理解しています。
スミマセン。
x265-develに参加してるとは、すごいですね!
バグ報告してみたいと思うこともあるのですが、英語が得意でないので、ためらってしまいます。
x265のパッチは、x264から流用しているファイル
source/common/x86/mc-a.asm
の中で、"x264_"というprefixを削除し忘れている箇所が2つあるので、そこを削除しているだけのものです。
あと、x265.pcのLibs.privateは、
Libs.private: -lstdc++ -lmingw32 -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lmoldname -lmingwex -lmsvcrt
となっており、-lstdc++以外は特に明示しなくてもffmpegのビルドには影響がなかったので、削除しています。
現在は修正されていますが、以前は、不要な-lpthreadが入っていたので、ついでに他のも削除しようと思ったのが発端だったような気がします。
今は、特に修正する必要はないかもしれません。
なんで、
--pkg-config-flags=--static
を使わないでconfigureを修正したんだろうかと、自分でも記憶があいまいだったのですが、今年の3/12に新しく追加されたオプションでした。
"x264_"のプレフィックスは、メールしたらすぐに修正されたようです。削除ではなく"x265_"に置き換わっているようです。
x265.pcのLibs.privateはMinGWだと、随分沢山のファイルがリンクされているのですね。
MacとはCMakeの部分が異なるのかもですね。失礼しました。
--pkg-config-flags=--staticは新しいオプションなのですね。ffmpegのメーリングリストで紹介したら、pkg_config='pkg-config --static'の方が良く知られているみたいなことを言われました。
さっそく"x265_"に修正されてると思ったら、報告してくださったんですね。
ありがとうございました。
私ももっと英語を勉強して、開発者さんたちと直接やりとりできるようになりたいです。
あと、このオプション
--pkg_config='pkg-config --static'
pkg-configのパスを指定したりするのに使うんだと思っていましたが、オプションを追加するのにも使えるとは知りませんでした。
いろいろと参考になりました。
いろいろ丁寧にコメントしてくださってありがとうございました。
今回の自分のffmpegコンパイルガイド改訂で、libmodplugを組み込むことにしました。
その際、ffmpeg configureスクリプトであべちんさんは、-lstdc++をenabled libmodplugの行に追加されていますが、この件についてffmpegメーリングリストに投げました。
結果、configureスクリプトが修正され
enabled libmodplug && require_pkg_config libmodplug libmodplug/modplug.h ModPlug_Load
になりましたのでお知らせします。
あと、libwebpは0.4.1ではダメですね。0.4.0を使ったら、あっさりOKでした。
情報ありがとうございます。
libmodplugの所がrequire_pkg_configに修正されたバージョンでconfigureしてみたところ、config.logに
undefined reference to _imp__...
というエラーが出てstopしてしまいました。
libmodplugの方を修正すれば良いのですが、とりあえずffmpegのconfigureを元にもどしてしみました。
逆に、libwebpは0.4.1でも問題ありませんでした。
ビルド環境によって違うのかもしれませんね。
libmodplugの件ですが、メーリングリストに投げてみますので、僕にメールを戴けますか? 以下の情報を含めてください。
MinGWのどんな環境か?
config.log
configureスクリプトが停止した時のエラー内容。
configureスクリプトに与えたオプションの内容。
*メーリングリストでは、編集しない、完全なコマンドの内容が要求されます。よろしくお願いします。
libwebpは分かりませんね。不思議です。使い方も分かんないのでいいかにゃ? f(^^;
原因は、libmodplugのデフォルトのヘッダだとDLLへのリンクとして判断され、スタティックリンクでないためエラーとなります。
libmodplugをスタティックライブラリとして利用しているために起こる現象ですね。
libmodplugのヘッダを修正すれば、configureでrequire_pkg_configとなっていてもエラーが出ないですむようにはなります。
具体的にはmodplug.hでMODPLUG_STATICを定義すればOKです。
私はこれでエラーを回避させてます。
現状、libmodplugのヘッダがshared library(DLL)として使うことをデフォルトとしていて、static libraryとして使う際にはヘッダでMODPLUG_STATICを宣言する必要があります。
なのでconfigureを変更するか、libmodplugのヘッダに修正を加えるかのどちらかを選ぶことになるかと思います。
でも
#define MODPLUG_STATIC
を宣言しています。
これを考えると、ffmpegではスタティックライブラリとして使うことを前提にしているのかなぁと思ったのですが、ffmpeg-2.2.7ではその宣言がなくなっていたんですよね。迷走している感じ。
個人的には、libmodplugをスタティックライブラリとして使うのだから、libmodplugを修正するのが、正攻法かなぁと思ってます。
僕の環境はMac OS Xなのですが、現在Windows(MinGW?)の方がエラーになっている状態のffmpegで正常にコンパイルできています。
libmodplugのconfigureオプションは、こちらのサイトと同じです。
Macで正常でWinでエラーになる理由が、ご指摘の#define MODPLUG_STATICをmodplug.hで定義することなのでしょうか?(済みません、言い方がうまくないです)
ちなみに、今あるffmpegのgitクローンでは、ffmpeg/libavformat/libmodplug.cに#define MODPLUG_STATICが宣言されています。
>Macで正常でWinでエラーになる理由が、ご指摘の#define MODPLUG_STATICをmodplug.hで定義することなのでしょうか?
逆です。エラーにならないように定義します。
modplug.hではWindows用DLLをデフォルトで使用する設定になっています。それをスタティックライブラリとして使用するのに、ヘッダでMODPLUG_STATICを宣言します。
ffmpeg/libavformat/libmodplug.cに#define MODPLUG_STATICが宣言されていることが、スタティックに使用するということです。
WindowsのDLL関連の固有の問題というしかありません。関数名がDLLとスタティックライブラリとでは異なっていることが原因です。
require_pkg_configでは、その宣言をしないでコンパイルされるのでDLLの関数名が見つからずエラーとなるのです。
MacOSXではスタティックでもシェアードでも名前が同じなのではないでしょうか?
それで挙動が異なるのではないかと推測いたします。
/usr/local/lib/pkgconfig/libmodplug.pc
を修正して、-DMODPLUG_STATICを追加することで、対応できることに気がつきました。具体的には、
Cflags: -I${includedir} -DMODPLUG_STATIC
とします。
どちらにせよ、libmodplug側で修正が必要なことには変わりありませんね。
どちらがスマートかは判断しかねますが、一応ご報告まで。
ご指摘の内容をmodplugのメンテナーにメールしようとして、はたと詰まりました。
繰り返しになって申し訳ありませんが、もう一度確認させてください。(理解が遅くてすみません)
modplug.hでのMODPLUG_STATICの宣言追加は、modplugをSharedライブラリで使うケースには影響はないのでしょうか?
あるいは、libmodplug.pcに-DMODPLUG_STATICを追加するのも、同じようにSharedライブラリで使うケースには影響はないのでしょうか?
そんなのはメンテナーに考えて貰えば良いのかも知れませんが、ちょっと気になりました。
個人的には、modplugのconfigureスクリプトのオプションで使い分けができれば良いように思います。
現行のmodplugのconfigureオプションである「./configure --prefix=/mingw --disable-shared --enable-static」では、ffmpegのconfigureスクリプトのエラーが避けられないのですよね?
そうそう、このエラーがlibmodplug not foundなのか、他のエラーなのかどうかも伺っていませんでした。
エラーは、次のような感じです。
check_pkg_config libmodplug libmodplug/modplug.h ModPlug_Load
pkg-config --exists --print-errors libmodplug
check_func_headers libmodplug/modplug.h ModPlug_Load -ID:/MinGW6/msys/1.0/local/include -LD:/MinGW6/msys/1.0/local/lib -lmodplug -lstdc++ -lm
check_ld cc -ID:/MinGW6/msys/1.0/local/include -LD:/MinGW6/msys/1.0/local/lib -lmodplug -lstdc++ -lm
check_cc -ID:/MinGW6/msys/1.0/local/include -LD:/MinGW6/msys/1.0/local/lib
BEGIN /tmp/ffconf.MDykmaQK.c
1 #include <libmodplug/modplug.h>
2 long check_ModPlug_Load(void) { return (long) ModPlug_Load; }
3 int main(void) { return 0; }
END /tmp/ffconf.MDykmaQK.c
gcc -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1 -D__printf__=__gnu_printf__ -std=c99 -fomit-frame-pointer -ID:/MinGW6/msys/1.0/local/include -LD:/MinGW6/msys/1.0/local/lib -c -o /tmp/ffconf.VYCDiWPi.o /tmp/ffconf.MDykmaQK.c
gcc -static -Wl,--nxcompat -Wl,--dynamicbase -Wl,--as-needed -ID:/MinGW6/msys/1.0/local/include -LD:/MinGW6/msys/1.0/local/lib -o /tmp/ffconf.JwUOdPmk.exe /tmp/ffconf.VYCDiWPi.o -lmodplug -lstdc++ -lm -lm -lz -lpsapi -ladvapi32 -lshell32
C:/Users/augus/AppData/Local/Temp/ffconf.VYCDiWPi.o:ffconf.MDykmaQK.c:(.text+0x1): undefined reference to `_imp__ModPlug_Load'
collect2.exe: error: ld returned 1 exit status
ERROR: libmodplug not found
いろいろとありがとうございます。
横入り失礼します。
とりあえず分かっていることは、
DLL作成時、__declspec(dllexport)を関数の前に付ける。
DLLから呼び出す時、__declspec(dllimport)を関数の前に付ける。
スタティックライブラリの時は、どちらも付けない。
ということを、modplug.hのMODPLUG_EXPORTマクロで切り替えています。
MODPLUG_STATICマクロを定義していないと、__declspec(dllimport)が付けられる条件になっており、`_imp__関数名'という形で呼び出されるため、undefined referenceになってしまいます。
要は、スタティックライブラリをリンクする場合、__declspec(dllimport)が付かないようにすればよいので、解決策は何通りか考えられると思います。
ffmpegのconfigureオプションで、
--extra-cflags=-DMODPLUG_STATIC
を追加してもOKでした。
libcaca、twolame、openjpegでも同じような問題があるのですが、私の場合は、各ライブラリのヘッダファイルを修正して、MinGW環境の時は__declspec(dllimport)が付かないようにしています。
これが正解かどうかは分かりませんが、ffmpegをビルドすることが目的なので、とりあえず良しとしています。
あと、エラーメッセージやログなどはコメント欄が長くなってしまいますので、pastebinなどを利用していただけると助かります。
エラーの内容を拝見しました。概ね、僕が最初にffmpegにlibmodplugを組み込もうとした時に出たエラーに似ています。
それで思い出したのですが、ffmpegを修正してもらった時、configureオプションに「--pkg-config-flags=--static」をつけてね!! と言われていたのを忘れていました。
なので、
「./configure --enable-libmodplug --pkg-config-flags=--static」
または
「./configure --pkg_config='pkg-config --static' --enable-libmodplug」
というオプションでffmpegをconfigureしても「ERROR: libmodplug not found」が発生するかどうかを確認して戴けますでしょうか?
管理人さんが、
ffmpegのconfigureオプションで、
--extra-cflags=-DMODPLUG_STATIC
を追加してもOKでした。
とのことでしたので、Windows環境での解決策としては、出揃った感じがあります。管理人さま、ffmpeg側のconfigureオプションでも解決できるんですね^^
どの解決法がスマートなのかは判断しかねますが、libmodplugをスタティックライブラリしか作成しない選択をしているので、私はmodplag.hヘッダを修正してエラー回避したいと思います。
./configure --pkg_config='pkg-config --static' --enable-libmodplug
でのエラーはこんな感じです。
http://pastebin.com/Dy3Gu1Fj
同じエラーで止まっているのがお分かりいただけるでしょうか?
やっとですが、Windows側で何らかの対策が必要なことは理解しました。
libmodplugのメンテナーに連絡を取るのは止めようと思います。理由は他にも対応が必要なライブラリがある様子だからです。
ffmpegメーリングリストでrequire_pkg_configに変更される際にWindowsの方から異論が出なかったのですが、新たに必要になった対策はどうやって伝えれば良いのか悩んでいます。
あるいは、ffmpegの変更をキャンセルして貰った方が皆さんにとって幸せなのでしょうか?
Windowsだけの問題でしょうから。
それに変更前のrequireが問題なかったのは、ヘッダの存在確認と関数の確認が別個に分かれていて、たまたま関数名がスタティックリンクの関数名と同じになってたからです。それにどちらにせよライブラリの追加修正が必要になりますよね。
個人的には今のまま(require_pkg_config)でよろしいかと思います。
問題あっても、メーリングリストやconfig.logからも解決はできますしね。
ffmpegメーリングリストのlibmodplugに関する部分が変更されたスレッドにWindowsでの暫定対策を書き込みました。
今のところ、文句、クレームはありません。
libmodplugに関する変更もそのまま維持されるようです。(多分…もし動きがあれば再度報告します)
eingusteさん、メーリングリストでの援護射撃ありがとうございました。
>eingusteさん、メーリングリストでの援護射撃ありがとうございました。
いえいえ、どうしたしまして。
援護射撃になってるか分かりませんが^^;;