связывание с libavcodec, все еще видим неопределенные ссылки

Я пытаюсь скомпилировать пример libavcodec. Я получаю следующую ошибку:

lol@foldingmachine:~/p/avtest$ g++ main.cpp -o main -lavcodec
main.cpp: In function ‘void audio_decode_example(const char*, const char*)’:
main.cpp:57:15: warning: ‘int avcodec_decode_audio4(AVCodecContext*, AVFrame*, int*, const AVPacket*)’ is deprecated [-Wdeprecated-declarations]
         len = avcodec_decode_audio4(c, decoded_frame, &got_frame, &avpkt);
               ^~~~~~~~~~~~~~~~~~~~~
In file included from main.cpp:1:0:
/usr/include/x86_64-linux-gnu/libavcodec/avcodec.h:4773:5: note: declared here
 int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame,
     ^~~~~~~~~~~~~~~~~~~~~
main.cpp:57:73: warning: ‘int avcodec_decode_audio4(AVCodecContext*, AVFrame*, int*, const AVPacket*)’ is deprecated [-Wdeprecated-declarations]
         len = avcodec_decode_audio4(c, decoded_frame, &got_frame, &avpkt);
                                                                         ^
In file included from main.cpp:1:0:
/usr/include/x86_64-linux-gnu/libavcodec/avcodec.h:4773:5: note: declared here
 int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame,
     ^~~~~~~~~~~~~~~~~~~~~
/tmp/ccbXVtbs.o: In function `audio_decode_example(char const*, char const*)':
main.cpp:(.text+0x37): undefined reference to `av_init_packet(AVPacket*)'
main.cpp:(.text+0x63): undefined reference to `avcodec_find_decoder(AVCodecID)'
main.cpp:(.text+0xa4): undefined reference to `avcodec_alloc_context3(AVCodec const*)'
main.cpp:(.text+0xf1): undefined reference to `avcodec_open2(AVCodecContext*, AVCodec const*, AVDictionary**)'
main.cpp:(.text+0x19c): undefined reference to `av_free(void*)'
main.cpp:(.text+0x203): undefined reference to `av_frame_alloc()'
main.cpp:(.text+0x266): undefined reference to `avcodec_decode_audio4(AVCodecContext*, AVFrame*, int*, AVPacket const*)'
main.cpp:(.text+0x2b8): undefined reference to `av_get_bytes_per_sample(AVSampleFormat)'
main.cpp:(.text+0x460): undefined reference to `avcodec_close(AVCodecContext*)'
main.cpp:(.text+0x46c): undefined reference to `av_free(void*)'
main.cpp:(.text+0x47b): undefined reference to `av_frame_free(AVFrame**)'
collect2: error: ld returned 1 exit status

Как видите, я связываюсь с libavcodec, но все еще получаю неопределенные ссылки. Есть ли что-нибудь еще, с чем мне нужно связать, чтобы определить эти символы?


person jcarpenter2    schedule 18.07.2017    source источник


Ответы (1)


Я спросил в IRC, и мне ответили, что нужно применить extern "C". Я изменил это:

#include <libavcodec/avcodec.h>

к этому:

extern "C" {
    #include <libavcodec/avcodec.h>
}

в исходном файле, и теперь он компилируется без ошибок.

person jcarpenter2    schedule 18.07.2017
comment
К вашему сведению, я нашел этот ответ полезным, связанным с этим вопросом: stackoverflow.com/a/1041880/1148702 - person Tim Arnold; 28.03.2018