【问题标题】:Undefined symbols in libav when compiling as C++, but not as C编译为 C++ 时 libav 中的未定义符号,但不是 C
【发布时间】:2012-11-19 22:17:20
【问题描述】:

我正在尝试使用 libav 库编译一些简单的代码。

// Some simple code to demonstrate
#include <libavformat/avformat.h>

int main(int argc, char *argv[]) {
    av_register_all();
    return 0;
}

我在 Mac 上,使用 gcc 版本 4.2.1。

当我尝试使用 C 编译代码时

gcc -o main main.c -lavformat

然后代码编译和链接正常。但是,当我尝试将其编译为 C++ 使用

g++ -o main main.cpp -lavformat

它给了我未定义的符号错误:

Undefined symbols for architecture x86_64:
  "av_register_all()", referenced from:
      _main in ccQ23HMe.o

当我使用-v 选项运行时,运行的链接步骤是:

// gcc
"/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.8.0 -o c
 /var/folders/r0/n22t1hyn7ts92jxgd9_pn8yw0000gn/T/main-uUfZkM.o -lavformat
-lSystem /usr/bin/../lib/clang/4.1/lib/darwin/libclang_rt.osx.a

// g++
"/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.8.0 -o c
 /var/folders/r0/n22t1hyn7ts92jxgd9_pn8yw0000gn/T/main-5QU6fj.o -lavformat
 -lstdc++ -lSystem /usr/bin/../lib/clang/4.1/lib/darwin/libclang_rt.osx.a

在这里,唯一的区别是在链接中添加了-lstdc++。

为什么会出现这些未定义的符号错误?是否有某些原因简单地将库添加到链接会导致这些未定义的符号?还是有其他原因导致此问题,可能与 libavformat 相关?

【问题讨论】:

  • @PaulR:不是真的。这是一个完全不同的库,尽管两种情况下的答案都是相同的。
  • -1:下次阅读图书馆的文档。我在一分钟内找到了该常见问题解答... :(
  • 嗯,这是 C++ 程序中的 C 库的一个常见问题 - 我认为我们不需要为每个适用的第三方库单独提出一个问题?
  • @PaulR:前提是 OP 已经知道它是一个纯 C 库。

标签: c++ linker libav


【解决方案1】:

libav“常见问题”列表covers this exact scenario!

这里,唯一的区别是在链接中添加了 -lstdc++。

不,你使用的是不同的语言和不同的默认调用约定。

标头中声明的av_register_all 未标记extern "C",而实际编译库中的定义需要良好的老式C 调用约定。

用extern "C"包围你的libav。

【讨论】:

  • :( 谢谢。我找到了在 C++ 上下文中使用该库的示例,所以我没有意识到这是必要的。当它允许时我会接受。
  • 如果定义了 __cplusplus,礼貌的 C 库作者通常会在其公共头文件中添加 extern "C"。 libavcodec 的作者选择不这样做,但这可能就是它让你措手不及的原因。
猜你喜欢
  • 2013-03-07
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
相关资源
最近更新 更多