【问题标题】:gcc: undefined reference togcc:未定义的引用
【发布时间】:2025-12-27 17:45:16
【问题描述】:

我想编译这个。

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


    【解决方案1】:

    你在混合 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
    

    【讨论】:

    • 关键步骤,这个。虽然这似乎不是原始发布者的问题,但这必须总体考虑。
    • @LimitedAtonement,我把它放进去是因为,虽然 OP 提供了一个扩展名为 .c 的文件,但已经设置了“C++”标签。
    【解决方案2】:

    但是,avpicture_get_size 是定义的。

    不,因为标题 (&lt;libavcodec/avcodec.h&gt;) 只是声明它。

    定义在库本身中。

    所以你可能想在调用 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

    【讨论】:

    • 在这种情况下可能类似于 -L$HOME/ffmpeg/lib,因为 ffmpeg 位于用户的主目录中,而不是安装到系统目录中。
    • 你好。运行 'gcc -I$HOME/ffmpeg/include program.c -lavcodes' 给了我 '/usr/bin/ld: cannot find -lavcodes collect2: ld returned 1 exit status'
    • 嗨,巫师。运行 'gcc -I$HOME/ffmpeg/include program.c -L$HOME/ffmpeg/lib' 给了我完全相同的错误 'program.c:(.text+0x18): undefined reference to `avpicture_get_size' '跨度>
    • 谢谢!运行 'gcc -I$HOME/ffmpeg/include program.c -L$HOME/ffmpeg/lib -lavcodec' 会给出 6 个未定义的参考错误。其中一些方法来自 libavcodec,其他方法来自 libavutil。所以我在命令末尾添加了 -lavutil 并编译了它。
    • 这一段“请注意库需要在需要它们的文件之后在命令行中指定”节省了我的时间,谢谢。
    最近更新 更多