gcc:未定义的引用

jam*_*e_y 39 c c++ linker gcc undefined-reference

我想编译一下.

program.c

#include <libavcodec/avcodec.h>

int main(){
    int i = avpicture_get_size(AV_PIX_FMT_RGB24,300,300);
}
Run Code Online (Sandbox Code Playgroud)

运行这个

gcc -I$HOME/ffmpeg/include program.c
Run Code Online (Sandbox Code Playgroud)

给出错误

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

但是,定义了avpicture_get_size.为什么会这样?

alk*_*alk 58

但是,定义了avpicture_get_size.

不,因为header(<libavcodec/avcodec.h>)只是声明它.

定义是库本身.

因此,您可能希望libavcodec在调用gcc时添加链接器选项以进行链接:

-lavcodec
Run Code Online (Sandbox Code Playgroud)

另请注意,需要在需要文件在命令行中指定库:

gcc -I$HOME/ffmpeg/include program.c -lavcodec
Run Code Online (Sandbox Code Playgroud)

不是这样的:

gcc -lavcodec -I$HOME/ffmpeg/include program.c
Run Code Online (Sandbox Code Playgroud)

更新:

参考Wyzard的评论,完整的命令可能如下所示:

gcc -I$HOME/ffmpeg/include program.c -L$HOME/ffmpeg/lib -lavcodec
Run Code Online (Sandbox Code Playgroud)

对于未存储在链接器标准位置的-L库,该-l选项指定了使用该选项指定的查找库的附加搜索路径,libavcodec.x.y.z在本例中.


有关gcc链接器选项的详细参考,请阅读此处.

  • 此段“请注意,在需要它们的文件之后,需要在命令行上指定库”,谢谢。 (2认同)

Tec*_*ile 5

您在混合C和C ++吗?可能发生的一个问题是.c文件的.h文件中的声明必须被下列包围:

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

和:

#if defined(__cplusplus)
  }
#endif
Run Code Online (Sandbox Code Playgroud)