gcc: undefined reference to

61
我希望您能编译这个东西。

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 已被定义。为什么会发生这种情况?

2个回答

87

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链接器选项的详细参考,请阅读此处


1
在这种情况下,可能会使用类似-L$HOME/ffmpeg/lib的东西,因为ffmpeg位于用户的主目录中,而不是安装到系统目录中。 - Wyzard
嗨,alk。运行“gcc -I$HOME/ffmpeg/include program.c -lavcodes”命令时出现了“/usr/bin/ld: cannot find -lavcodes collect2: ld returned 1 exit status”的错误提示。 - jamie_y
1
嗨Wyzard。运行'gcc -I$HOME/ffmpeg/include program.c -L$HOME/ffmpeg/lib'给了我完全相同的错误'program.c:(.text+0x18): undefined reference to `avpicture_get_size''。 - jamie_y
1
谢谢!运行“gcc -I$HOME/ffmpeg/include program.c -L$HOME/ffmpeg/lib -lavcodec”会出现6个未定义的引用错误。其中一些方法来自libavcodec,另一些来自libavutil。因此,我在命令末尾添加了-lavutil并进行了编译。 - jamie_y
4
这段话"请注意,在需要这些库的文件后面,必须在命令行中明确指定这些库"拯救了我的一天,谢谢。 - kR105
显示剩余2条评论

12

你是否混用了C和C++?可能会出现的一个问题是,.c文件的.h文件中的声明需要被以下内容包围:

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

并且:

#if defined(__cplusplus)
  }
#endif

注意:如果无法/不愿修改相关的.h文件,可以使用extern "C"来包含它们:
extern "C" {
#include <abc.h>
} //extern

关键步骤。虽然它似乎不是原帖作者的问题,但这必须被普遍考虑。 - lmat - Reinstate Monica
@LimitedAtonement,我加入了这个内容,因为虽然OP提供了一个扩展名为.c的文件,但已经设置了“C ++”标签。 - Technophile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接