gcc:未定义对

gcc: undefined reference to

提问人:jamie_y 提问时间:3/16/2014 最后编辑:alkjamie_y 更新时间:1/22/2021 访问量:191049

问:

我想编译这个。

程序.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 链接器 未定义引用

评论


答:

87赞 alk 3/16/2014 #1

但是,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-llibavcodec.x.y.z


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

评论

1赞 Wyzard 3/16/2014
在这种情况下可能类似,因为 ffmpeg 位于用户的主目录中,而不是安装到系统目录中。-L$HOME/ffmpeg/lib
0赞 jamie_y 3/16/2014
嗨,alk。运行“gcc -I$HOME/ffmpeg/include program.c -lavcodes”给了我“/usr/bin/ld:找不到-lavcodes collect2:ld返回1退出状态”
1赞 jamie_y 3/16/2014
嗨,Wyzard。运行'gcc -I$HOME/ffmpeg/include program.c -L$HOME/ffmpeg/lib'给了我完全相同的错误'program.c:(.text+0x18): undefined reference to 'avpicture_get_size' '
1赞 jamie_y 3/16/2014
谢谢!运行“gcc -I$HOME/ffmpeg/include program.c -L$HOME/ffmpeg/lib -lavcodec”会产生 6 个未定义的引用错误。一些方法来自 libavcodec,其他方法来自 libavutil。所以我在命令的末尾添加了 -lavutil,它编译了。
4赞 kR105 2/20/2016
这一段“另请注意,在需要它们的文件之后,需要在命令行上指定库”挽救了我的一天,谢谢。
12赞 Technophile 3/3/2017 #2

您是否混合了 C 和 C++?可能发生的一个问题是,文件中的声明需要被以下部分包围:.h.c

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

和:

#if defined(__cplusplus)
  }
#endif

注意:如果不能/不愿意修改相关文件,您可以用以下方法将其包含:.hextern "C"

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

评论

0赞 lmat - Reinstate Monica 11/2/2017
关键的一步,这个。虽然这似乎不是原始海报的问题,但必须从总体上考虑这一点。
0赞 Technophile 11/4/2017
@LimitedAtonement,我之所以把它放进去,是因为虽然 OP 提供了一个扩展名为 .c 的文件,但已经设置了“C++”标签。