编译为 C++ 时 libav 中的未定义符号,但不编译为 C

Undefined symbols in libav when compiling as C++, but not as C

本文关键字:编译 符号 C++ libav 未定义      更新时间:2023-10-16

我正在尝试使用 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 特别相关?

libav "常见问题"列表涵盖了这个确切的场景!

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

不 — 那个,你使用的是具有不同默认调用约定的不同语言。

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

extern "C"包围您的 libav 包含。

相关文章: