无法为我自己的Qt项目链接ffmpeg库

时间:2013-08-14 18:46:18

标签: qt ffmpeg static-linking

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

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

安装yasm和x264后,我跑了 ./configure --enable-static --enable-gpl --enable-libx264然后 制造&& 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&# 39; ld:警告:找不到选项的目录' -F / tmp / qt-stuff-85167 / source / qt-everywhere-opensource-src-4.8.1 / Desktop / Qt / 4.8.1 / gcc / lib&# 39; 架构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.o中的_decode_audio       ffmpeg.o中的_decode_video       ffmpeg.o中的_transcode_init   " _copy_tb",引自:       ffmpeg.o中的_transcode_init   " _copy_ts",引自:       ffmpeg.o中的_process_input   " _debug_ts",引自:       ffmpeg.o中的_write_frame       ffmpeg.o中的_do_audio_out       ffmpeg.o中的_do_video_out       ffmpeg.o中的_decode_video       ffmpeg.o中的_process_input   " _do_benchmark",引自:       ffmpeg.o中的_ffmpeg_cleanup       _main在ffmpeg.o中   " _do_benchmark_all",引自:       ffmpeg.o中的_update_benchmark   " _do_hex_dump",引自:       ffmpeg.o中的_check_keyboard_interaction       ffmpeg.o中的_process_input   " _do_pkt_dump",引自:       ffmpeg.o中的_check_keyboard_interaction       ffmpeg.o中的_process_input   " _dts_delta_threshold",引自:       ffmpeg.o中的_process_input   " _dts_error_threshold",引自:       ffmpeg.o中的_do_video_out       ffmpeg.o中的_process_input   " _exit_on_error",引自:       ffmpeg.o中的_write_frame       ffmpeg.o中的_do_subtitle_out       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       ffmpeg.o中的_do_video_out       ...   " _ffmpeg_parse_options",引自:       _main在ffmpeg.o中   " _frame_bits_per_raw_sample",引自:       ffmpeg.o中的_transcode_init   " _iconv",引自:       libavcodec.a中的_avcodec_decode_subtitle2(utils.o)   " _iconv_close",引自:       libavcodec.a中的_avcodec_decode_subtitle2(utils.o)       libavcodec.a中的_avcodec_open2(utils.o)   " _iconv_open",引自:       libavcodec.a中的_avcodec_decode_subtitle2(utils.o)       libavcodec.a中的_avcodec_open2(utils.o)   " _init_simple_filtergraph",引自:       ffmpeg.o中的_transcode_init   " _ist_in_filtergraph",引自:       ffmpeg.o中的_decode_audio       ffmpeg.o中的_decode_video   " _options",引自:       _main在ffmpeg.o中      (也许你的意思是:_ff_mpv_generic_options,_ff_rawvideo_options,_ av_set_options_string,_ff_rtsp_options)   " _parse_loglevel",引自:       _main在ffmpeg.o中   " _parse_time_or_die",引自:       ffmpeg.o中的_parse_forced_key_frames   " _print_error",引自:       ffmpeg.o中的_write_frame       ffmpeg.o中的_process_input   " _print_stats",引自:       ffmpeg.o中的_print_report   " _qp_hist",引自:       ffmpeg.o中的_print_report       ffmpeg.o中的_check_keyboard_interaction   " _register_exit",引自:       _main在ffmpeg.o中   " _show_banner",引自:       _main在ffmpeg.o中   " _show_usage",引自:       _main在ffmpeg.o中   " _stdin_interaction",引自:       ffmpeg.o中的_transcode   " _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]错误1 14:35:42:过程" / usr / bin / make"退出代码2。 构建项目ffmpeg时出错(目标:桌面) 执行构建步骤时,制作'


编辑:


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

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

cmdutils.c ffmpeg_filter.c ffmpeg_opt.c

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

2 个答案:

答案 0 :(得分:0)

  

ld:警告:找不到选项的目录   '-L / tmp目录/ QT-东西-85167 /源/ QT-比比皆是 - 开源-SRC-4.8.1 /桌面/ QT / 4.8.1 /海合会/ lib目录'   ld:警告:找不到选项的目录   '-F / TMP / QT-东西-85167 /源极/ QT-无处不开源-SRC-4.8.1 /桌面/ QT / 4.8.1 / GCC / LIB'

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

答案 1 :(得分:0)

问题可能出在您的源代码中。当你#include标题时,你必须将它们包装在extern“C”{}中。除此之外,链接器尝试使用c ++函数mangling进行链接。

extern "C"
{
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswscale/swscale.h>
}