提问人:jamie_y 提问时间:3/16/2014 最后编辑:alkjamie_y 更新时间:1/22/2021 访问量:191049
gcc:未定义对
gcc: undefined reference to
问:
我想编译这个。
程序.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是定义的。为什么会这样?
答:
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
-l
libavcodec.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
注意:如果不能/不愿意修改相关文件,您可以用以下方法将其包含:.h
extern "C"
extern "C" {
#include <abc.h>
} //extern
评论
0赞
lmat - Reinstate Monica
11/2/2017
关键的一步,这个。虽然这似乎不是原始海报的问题,但必须从总体上考虑这一点。
0赞
Technophile
11/4/2017
@LimitedAtonement,我之所以把它放进去,是因为虽然 OP 提供了一个扩展名为 .c 的文件,但已经设置了“C++”标签。
评论