我正在 Snow Leopard 上从源代码编译 ffmpeg。使用 Macport 不是一个选项,因为我在 ffmpeg 中有一些自定义修改。制作命令是:
$ ./configure --enable-gpl --enable-libmp3lame --enable-static \
--disable-shared --enable-libx264 --enable-pthreads \
--disable-doc --enable-avfilter
$ make
错误:
CC ffplay.o
ffplay.c: In function ‘SDL_main’:
ffplay.c:3157: warning: assignment discards qualifiers from pointer target type
LD ffplay_g
Undefined symbols for architecture x86_64:
"_x264_encoder_open_112", referenced from:
_X264_init in libavcodec.a(libx264.o)
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [ffplay_g] Error 1
我已经从源代码编译了 libx264,一切顺利。
$ cd x264-snapshot-20101228-2245; ./configure && make && sudo make install
...它包含符号“_x264_encoder_open_112”
$ nm ./libx264.a | grep _x264_encoder_open_112
0000000000003ef0 T _x264_encoder_open_112
000000000000d7b0 S _x264_encoder_open_112.eh
可能出了什么问题?
来自
/opt/local/lib
和 /usr/lib
的类似名称的库之间存在冲突。前者由 Macport 维护,后者是我自己的开发区域。由于我想使用后一个位置,因此我必须删除/临时重命名 /opt/local/lib
中的位置,以强制 gcc 从 /usr/lib
中选取它们
在您的情况下,路径可能会有所不同,但您明白了。
如果您有更干净的方法来实现这一目标,我洗耳恭听
尝试使用 --enable-static 配置 x264。
我遇到了类似的问题,这对我来说是一个解决方案。
我将为遇到此问题的 Mac OSX 上的 Homebrew 用户添加:
我在
/usr/lib
中还有额外的 libx264 库,我必须将其删除。
这导致使用
brew install ffmpeg --use-clang
或 brew install ffmpeg --use-gcc
构建 ffmpeg 时出现此错误:
LD libavcodec/libavcodec.53.dylib
AR libavcodec/libavcodec.a
Undefined symbols for architecture x86_64:
"_x264_bit_depth", referenced from:
_X264_init_static in libx264.o
_X264_frame in libx264.o
"_x264_picture_init", referenced from:
_X264_frame in libx264.o
"_x264_param_default_preset", referenced from:
_X264_init in libx264.o
"_x264_param_apply_fastfirstpass", referenced from:
_X264_init in libx264.o
"_x264_param_apply_profile", referenced from:
_X264_init in libx264.o
"_x264_encoder_open_120", referenced from:
_X264_init in libx264.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [libavcodec/libavcodec.53.dylib] Error 1
额外的文件是:
/usr/lib/libx264.79.dylib
/usr/lib/libx264.a
/usr/lib/libx264.dylib
但是这些版本可能会有所不同。删除后,构建成功。
将这个答案留在这里,因为试图找到与
libavcodec
失败的联系非常令人困惑。
我编译了所有支持模块/编解码器,这些模块/编解码器旨在内置到 FFmpeg 中,位于 bash 脚本中名为“$workspace”的临时目录中。
我正在使用
FFmpeg n6.1.1
并且它足够聪明,可以使用已经在 "$workspace"
目录中使用 --prefix="$workspace"
编译的 vmaf 来构建自身,但是在完成构建 ffmpeg 和 ffprobe 寻找继续工作的基本文件之后,它找不到它们,因为它们应该位于不同的系统目录中。我通过从我的 "$workspace"
文件夹复制并创建软链接(如下所示的示例)到 FFmpeg 将在其中查找这些文件的文件夹解决了这个问题。
[[ ! -d "/usr/local/include/libvmaf" ]] && mkdir -p "/usr/local/include/libvmaf"
cp -f "$workspace/include/libvmaf"/* "/usr/local/include/libvmaf/"
cp -f "$workspace/lib/x86_64-linux-gnu/pkgconfig/libvmaf.pc" "/usr/local/lib/x86_64-linux-gnu/pkgconfig/libvmaf.pc"
cp -f "$workspace/bin/vmaf" "/usr/local/bin/vmaf" && chmod 755 "/usr/local/bin/vmaf"
cp -f "$workspace/lib/x86_64-linux-gnu/libvmaf.so.3.0.0" "/usr/local/lib/x86_64-linux-gnu/libvmaf.so.3.0.0"
ln -s "/usr/local/lib/x86_64-linux-gnu/libvmaf.so.3.0.0" "/usr/local/lib/x86_64-linux-gnu/libvmaf.so.3"
ln -s "/usr/local/lib/x86_64-linux-gnu/libvmaf.so.3" "/usr/local/lib/x86_64-linux-gnu/libvmaf.so"
如果您想查看我完成工作的完整脚本,您可以在 GitHub 上找到它这里