g++的编译问题
compilation problem with g++
我正在尝试运行一个使用ffmpeg库解码mp3文件的程序。我使用以下选项来编译程序:
g++ -c play.cpp -o play.o
g++ -o play play.o -L/usr/local/lib -lavutil -lavcodec -lavformat -lavdevice
-lavfilter -ldl -lasound -L/usr/lib -lSDL -lpthread -lz -lswscale -lm
但是当链接我得到以下错误:
play.cpp:(.text+0x49): undefined reference to `av_dup_packet(AVPacket*)'
play.cpp:(.text+0x66): undefined reference to `av_malloc(unsigned int)'
play.cpp:(.text+0x324): undefined reference to `avcodec_decode_audio3(AVCodecContext*, short*, int*, AVPacket*)'
play.cpp:(.text+0x387): undefined reference to `av_free_packet(AVPacket*)'
等等…这些报告的函数在libavcodec中可用。等,我已经指定了链接选项。谁能告诉我这里可能有什么问题或建议如何接近调试这个?
这是您自己的程序,而不是libav标准示例吗?我可能是错的,但如果是这样,你可能会忘记指定extern "C",而包括libav头:
extern "C"
{
#include <avcodec.h>
#include <avformat.h>
}
这可能是问题,因为你试图用c++编译器编译源代码,libav (ffmpeg)是用C编译器编译的,所以你必须标记包含库的头,由C编译器使用extern C编译。
如果你已经将include标记为extern C,请从你的程序中发布一些代码块来查看…
您应该确保使用详细链接(-Wl,--verbose
)选择了正确的-lavcodec
版本,并使用objdump或ldd检查这些符号是否真的在库中。
你可以尝试切换-l
标志的顺序,这些是非常重要的;但是,由于play.cpp包含对-lavcodec
中函数的引用,因此标志顺序应该已经正确。
相关文章:
- 编译包含字符串的代码时遇到问题
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 编译要在英特尔Hyperscan中使用的.cc文件时出现问题
- 如何在 Mac 上正确编译C++,当它在 Linux 上编译没有问题时?
- Rextester 语言编译C++问题
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 编译 llvm 插件时出现问题:llvm/Config/llvm-config.h:没有这样的文件或目录
- C++ 多级虚拟继承编译问题
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 使用 CImg 库的 std::min 和 std::max 的编译问题
- Qt Visual Studio 2015 加载项编译问题
- 构造函数和 G++ 编译配方的问题
- 解析问题 - 预期的非限定 ID - #include <array> 编译错误
- libssh 问题编译问题未定义的错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- Visual Studio 2017问题编译了C 代码,而该代码则在Linux中编译
- 这个C++代码有什么问题?编译错误:调用“测试::测试(测试)”没有匹配函数
- 试图编译基本Boost PropertyTree示例时出现问题-编译错误.该怎么做
- 如何解决***缺少分隔符的问题.编译QT(或支持库)时