gcc编译libavformat代码,但g ++没有

时间:2017-03-14 17:00:39

标签: c++ gcc g++ libavformat

为了确定给定文件的视频持续时间,我使用libavformat。我的程序如下:

#include <stdio.h>
#include <libavformat/avformat.h>
#include <libavutil/dict.h>
int main (int argc, char **argv) {
    AVFormatContext *fmt_ctx = NULL;
    int ret;
    if (argc != 2) {
        printf("usage: %s <input_file>\n", argv[0]);
        return 1;
    }
    av_register_all();
    if ((ret = avformat_open_input(&fmt_ctx, argv[1], NULL, NULL)))
        return ret;
    int64_t duration = fmt_ctx->duration;
    int hours, mins, secs;
    secs  = duration / AV_TIME_BASE;
    mins  = secs / 60;
    secs %= 60;
    hours = mins / 60;
    mins %= 60;
    printf("Duration: %02d:%02d:%02d\n", hours, mins, secs);
    avformat_free_context(fmt_ctx);
    return 0;
}

我的问题是,虽然gcc编译代码很好,但g ++也没有抱怨,但创建的目标文件既不能用gcc也不能用g ++链接。或者更确切地说:

gcc -c duration.c
gcc -o duration duration.o -lavformat
./duration my_movie.mp4

的工作原理。但是这个

g++ -c duration.c # "works" as in "g++ does not complain"
g++ -o duration duration.o -lavformat # (gcc produces the same output after compiling with g++)
duration.o: In function `main':
duration.c:(.text+0x41): undefined reference to `av_register_all()'
duration.c:(.text+0x62): undefined reference to `avformat_open_input(AVFormatContext**, char const*, AVInputFormat*, AVDictionary**)'
duration.c:(.text+0x18c): undefined reference to `avformat_free_context(AVFormatContext*)'
collect2: error: ld returned 1 exit status

不起作用。这使我得出结论,g ++不会产生可以正确链接的代码(在这种情况下)。

我真的想用g ++来完成这个工作,因为它是一个更大的c ++项目的一部分,而且总是需要编译使用gcc来使用这个库的文件会有点混乱。有谁知道为什么g ++不能正确编译这个程序?

1 个答案:

答案 0 :(得分:2)

此错误告诉我们所有我们需要知道的事情:

extern "C" {
#include <libavformat/avformat.h>
#include <libavutil/dict.h>
}

链接器不会知道参数的类型,除非它认为它是C ++函数。所以你需要这样做:

extern "C"

通常,头文件中会包含private void crossFadeImages(Drawable imageToFadeOut, Drawable imageToFadeIn) { TransitionDrawable td = new TransitionDrawable( new Drawable[] { imageToFadeOut, imageToFadeIn }); m_myimageView.setImageDrawable(td); td.startTransition(200); } 部分。 FFmpeg项目似乎对这样做不感兴趣。如FFmpeg ticket #3626中所述,某些标头可能包含与C ++不兼容的C结构。

如果遇到这样的问题,你需要在C中写一个垫片。