0

编辑:问题已解决(见底部)

我花了很多时间寻找我的问题的解决方案,但没有成功。我在 OSX 上并试图将 ffmpeg 链接到我自己的 Qt 项目。我试图做最简单的事情,但即使这样也行不通:

安装 yasm 和 x264 后,我运行 ./configure --enable-static --enable-gpl --enable-libx264 然后 make && make install

当我尝试在命令行上运行 ffmpeg 时,它运行良好。然后我只是在 ffmpeg 目录中设置了一个简单的项目,其中包含以下 ffmpeg.pro 文件:

TEMPLATE = app

QT += core

INCLUDEPATH += /usr/local/include
LIBS += -L/usr/local/lib
LIBS += -lavdevice -lavfilter -lavformat -lavcodec -lpostproc -lswresample -lswscale -lavutil -lpthread -lbz2 -lm -lz -lx264

HEADERS += ffmpeg.h

SOURCES += ffmpeg.c

我不确定我是否需要所有这些库,但它们都是 ffmpeg 创建的所有 .a 文件。当我尝试(按原样)构建项目时,出现以下链接器错误:

g++ -headerpad_max_install_names -arch x86_64 -Xarch_x86_64 -mmacosx-version-min=10.5 -o ffmpeg.app/Contents/MacOS/ffmpeg ffmpeg.o -F/Users/dtamayo/QtSDK/Desktop/Qt/4.8.1/gcc/lib -L/Users/dtamayo/QtSDK/Desktop/Qt/4.8.1/gcc/lib -L/usr/local/lib -lavdevice -lavfilter -lavformat -lavcodec -lpostproc -lswresample -lswscale -lavutil -lpthread -lbz2 -lm -lz -lx264 -framework QtGui -L/usr/local/pgsql/lib -L/tmp/qt-stuff-85167/source/qt-everywhere-opensource-src-4.8.1/Desktop/Qt/4.8.1/ gcc/lib -F/tmp/qt-stuff-85167/source/qt-everywhere-opensource-src-4.8.1/Desktop/Qt/4.8.1/gcc/lib -framework QtCore ld:警告:找不到目录选项 '-L/usr/local/pgsql/lib' ld:警告:找不到选项 '-L/tmp/qt-stuff-85167/source/qt-everywhere-opensource-src-4.8.1/Desktop/ 的目录Qt/4.8.1/gcc/lib' ld:警告:找不到选项'-F/tmp/qt-stuff-85167/source/qt-everywhere-opensource-src-4.8.1/Desktop/Qt/4.8.1/gcc/lib'的目录未定义的符号架构x86_64:“ _audio_sync_method”,引用自:ffmpeg.o 中的_write_frame ffmpeg.o 中的_do_audio_out “_audio_volume”,引用自:ffmpeg.o 中的_transcode_init “_cmdutils_read_file”,引用自:ffmpeg.o 中的_transcode_init “_configure_filtergraph”,引用自:ffmpeg 中的_decode_audio .o _decode_video in ffmpeg.o _transcode_init in ffmpeg.o "_copy_tb",引用自:_transcode_init in ffmpeg.o "_copy_ts",引用自:_process_input in ffmpeg.o "_debug_ts",引用自:_write_frame in ffmpeg.o _do_audio_out in ffmpeg。o ffmpeg.o 中的_do_video_out ffmpeg.o 中的_decode_video ffmpeg.o "_do_benchmark" 中的_process_input,引用自:ffmpeg.o 中的_ffmpeg_cleanup ffmpeg.o "_do_benchmark_all" 中的_main,引用自:ffmpeg.o "_do_hex_dump" 中的_update_benchmark,引用来自:ffmpeg.o 中的_check_keyboard_interaction ffmpeg.o "_do_pkt_dump" 中的_process_input,引用自:ffmpeg.o 中的_check_keyboard_interaction ffmpeg.o "_dts_delta_threshold" 中的_process_input,引用自:ffmpeg.o "_dts_error_threshold" 中的_process_input,引用自:_do_video_out in ffmpeg.o ffmpeg.o 中的_process_input "_exit_on_error",引用自:ffmpeg.o 中的_write_frame ffmpeg 中的_do_subtitle_out。o ffmpeg.o 中的 _process_input "_exit_program",引用自: ffmpeg.o 中的_sigterm_handler ffmpeg.o 中的_assert_avoptions ffmpeg.o 中的_abort_codec_experimental ffmpeg.o 中的_write_frame ffmpeg.o 中的_do_audio_out ffmpeg.o 中的_do_subtitle_out _do.mpeg.o 中的_do_video_out . "_ffmpeg_parse_options",引用自:ffmpeg.o中的_main "_frame_bits_per_raw_sample",引用自:ffmpeg.o中的_transcode_init "_iconv",引用自:libavcodec.a(utils.o)中的_avcodec_decode_subtitle2 "_iconv_close",引用自:_avcodec_decode_subtitle2在 libavcodec.a(utils.o) 中的 _avcodec_open2 在 libavcodec.a(utils.o) "_iconv_open",引用自: _avcodec_decode_subtitle2 in libavcodec.a(utils.o) libavcodec.a(utils.o) "_init_simple_filtergraph" 中的_avcodec_open2,引用自:ffmpeg.o "_ist_in_filtergraph" 中的_transcode_init,引用自:ffmpeg.o 中的_decode_audio ffmpeg.o "_options" 中的_decode_video,引用自:_main in ffmpeg。 .o ffmpeg.o "_print_stats" 中的 _process_input,引用自:ffmpeg.o "_qp_hist" 中的 _print_report,引用自:ffmpeg 中的 _print_report。o ffmpeg.o "_register_exit" 中的_check_keyboard_interaction,引用自:ffmpeg.o "_show_banner" 中的_main,引用自:ffmpeg.o "_show_usage" 中的_main,引用自:ffmpeg.o "_stdin_interaction" 中的_main,引用自:_transcode在ffmpeg.o "_uninit_opts"中,引用自:ffmpeg.o中的_ffmpeg_cleanup "_video_sync_method",引用自:ffmpeg.o中的_write_frame ffmpeg.o中的_do_video_out ffmpeg.o中的_transcode_init "_vstats_filename",引用自:ffmpeg.o中的_ffmpeg_cleanup ffmpeg.o 中的 _do_video_out ffmpeg.o 中的 _do_video_stats ffmpeg.o 中的 _flush_encoders ld:未找到架构 x86_64 collect2 的符号:ld 返回 1 个退出状态 make:离开目录`/Users/dtamayo/Desktop/ffmpeg-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK__Debug' make:* [ffmpeg.app/Contents/MacOS/ffmpeg] Error 1 14:35:42: The process "/usr/bin/make" exited with code 2. Error while building project ffmpeg (target: Desktop) When execution build step'制作'


编辑:


非常感谢您的快速回复。我很尴尬地说,在朋友的帮助下我发现了问题,所以我会在这里添加解决方案,以防有其他像我一样无能的人遇到同样的问题!

问题是我没有将以下源文件添加到项目中,这些源文件不是作为 ffmpeg 库之一的一部分构建的:

cmdutils.c ffmpeg_filter.c ffmpeg_opt.c

此外,我必须将 usr/lib 添加到我的库路径中,并添加库 -liconv。

4

2 回答 2

0

问题可能出在您的源代码中。当您#include 标头时,您必须将它们包装在 extern "C" {} 中。没有这个,链接器会尝试使用 c++ 函数修饰进行链接。

extern "C"
{
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
}
于 2013-08-14T20:40:10.753 回答
0

ld:警告:找不到选项'-L/tmp/qt-stuff-85167/source/qt-everywhere-opensource-src-4.8.1/Desktop/Qt/4.8.1/gcc/lib'的目录ld:警告:找不到选项“-F/tmp/qt-stuff-85167/source/qt-everywhere-opensource-src-4.8.1/Desktop/Qt/4.8.1/gcc/lib”的目录

您是否在 /tmp 上安装了 Qt 并在重新启动后自动删除?我不是 OSX 用户,所以这个平台的工作方式可能与我想象的不同,但是当链接器尝试访问不存在的文件夹时,它看起来并不好。

于 2013-08-14T19:36:15.990 回答