gcc:未定义的引用

问题描述 投票:36回答:2

我想编译一下。

program.c

#include <libavcodec/avcodec.h>

int main(){
    int i = avpicture_get_size(AV_PIX_FMT_RGB24,300,300);
}

运行这个

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

给出错误

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

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

c++ c gcc linker undefined-reference
2个回答
55
投票

但是,定义了avpicture_get_size。

不,因为标题(<libavcodec/avcodec.h>)只是宣布它。

定义在库本身中。

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

-lavcodec

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

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

不是这样的:

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

更新:

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

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

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


有关gcc的链接器选项please read here的详细参考。


5
投票

你在混合使用C和C ++吗?可能发生的一个问题是.h文件中.c文件中的声明需要包围:

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

和:

#if defined(__cplusplus)
  }
#endif
© www.soinside.com 2019 - 2024. All rights reserved.