gcc:链接外部库

Posted

技术标签:

【中文标题】gcc:链接外部库【英文标题】:gcc: Linking an External Library 【发布时间】:2014-03-14 21:20:34 【问题描述】:

在 program.c 中,我想使用 libavcodec/avcodec.h 中定义的方法 'avcodec_register_all()'。

跑步

gcc program.c -L$HOME/ffmpeg/lib/libavfilter.a -L$HOME/ffmpeg/lib/libavcodec.a

给我一​​个错误

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

拼写正确,功能已定义。为什么会这样?

program.c

#include <stdio.h>

int main (int args, char *argv[])

 avcodec_register_all();

【问题讨论】:

试试-L$HOME/ffmpeg/lib/ -lavfilter -lavcodec 命名,这给了我大约 1000 个未定义的参考错误。 avcodec_register_all 是其中之一吗?还是那个错误现在消失了? avcodec_register_all 未定义引用错误消失了,但我有其他方法的未定义引用错误。 然后查找定义了这些函数的库并以相同的方式添加它们。 【参考方案1】:

是这样的

gcc -static -lavfilter -lavcodec -L/HOME/ffmpeg/lib/

您需要包含文件avcodec.h,并将该文件的路径添加到 gcc 的包含路径标志中。

gcc -static -lavfilter -lavcodec -L$HOME/ffmpeg/lib/ -I$HOME/ffmpeg/include

给出静态是因为您尝试使用 *.a 库而不是 *.so(动态)。

【讨论】:

运行 'gcc -lavfilter -lavcondec -L/$HOME/ffmpeg/lib/ -I/$HOME/ffmpeg/include program.c' 给我 '/usr/bin/ld: 找不到-lavcondec collect2: ld 返回 1 个退出状态' 我也有错字,我用avcondec的时候是avcodec,对不起 运行 'gcc -static -lavfilter -lavcodec -L/$HOME/ffmpeg/lib/ -I/$HOME/ffmpeg/include program.c' 给出 '未定义的对 `avcodec_register_all' 的引用' 再次检查编辑,请添加include "avcodec.h"【参考方案2】:

-lavcodec与gcc的现有参数一起使用

【讨论】:

【参考方案3】:

其中一个原因可能是函数avcodec_register_all() 是在C++ 文件中定义的。它应该在avcodec.h 中定义为extern "C",并且应该使用这个正确的avcodec.h 编译库。

【讨论】:

在这种情况下,函数是用C定义的。

以上是关于gcc:链接外部库的主要内容,如果未能解决你的问题,请参考以下文章

[An Introduction to GCC 学习笔记] 08 链接外部外部动态库C标准

[An Introduction to GCC 学习笔记] 07 链接外部静态库

[An Introduction to GCC 学习笔记] 06 链接外部库头文件

检查“与外部库链接”示例时的矛盾结果

gcc新版本号引起的编译错误(命令运行时的外部库输入位置)

交叉编译时如何使用外部库?