gcc: undefined reference to

170,692

Solution 1

However, avpicture_get_size is defined.

No, as the header (<libavcodec/avcodec.h>) just declares it.

The definition is in the library itself.

So you might like to add the linker option to link libavcodec when invoking gcc:

-lavcodec

Please also note that libraries need to be specified on the command line after the files needing them:

gcc -I$HOME/ffmpeg/include program.c -lavcodec

Not like this:

gcc -lavcodec -I$HOME/ffmpeg/include program.c

Referring to Wyzard's comment, the complete command might look like this:

gcc -I$HOME/ffmpeg/include program.c -L$HOME/ffmpeg/lib -lavcodec

For libraries not stored in the linkers standard location the option -L specifies an additional search path to lookup libraries specified using the -l option, that is libavcodec.x.y.z in this case.


For a detailed reference on GCC's linker option, please read here.

Solution 2

Are you mixing C and C++? One issue that can occur is that the declarations in the .h file for a .c file need to be surrounded by:

#if defined(__cplusplus)
  extern "C" {                 // Make sure we have C-declarations in C++ programs
#endif

and:

#if defined(__cplusplus)
  }
#endif

Note: if unable / unwilling to modify the .h file(s) in question, you can surround their inclusion with extern "C":

extern "C" {
#include <abc.h>
} //extern
Share:
170,692
jamie_y
Author by

jamie_y

Updated on January 22, 2021

Comments

  • jamie_y
    jamie_y over 3 years

    I would like to compile this.

    program.c

    #include <libavcodec/avcodec.h>
    
    int main(){
        int i = avpicture_get_size(AV_PIX_FMT_RGB24,300,300);
    }
    

    Running this

    gcc -I$HOME/ffmpeg/include program.c
    

    gives error

    /tmp/ccxMLBme.o: In function `main':
    program.c:(.text+0x18): undefined reference to `avpicture_get_size'
    collect2: ld returned 1 exit status
    

    However, avpicture_get_size is defined. Why is this happening?