编译为 C++ 时 libav 中的未定义符号,但不编译为 C
Undefined symbols in libav when compiling as C++, but not as C
我正在尝试使用 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 包含。
相关文章:
- 尝试从 XamlApplication 编译 C++/WinRT 空白应用程序时,我收到未解析的外部符号 winrt_make_*
- LD:尝试编译项目时找不到架构x86_64符号
- 在macos上编译代码的未解析符号
- 编译为目标 wasm 时未定义的符号
- 仅在使用 gradle 在 Travis CI 上编译时才"multiple definition" googletest 符号
- 与Qt交叉编译到Raspberry Pi 3B+通讯录(协议缓冲区)-错误符号查找错误
- 编译了一个recent-C++.因此,如果没有暴露std符号,请在旧系统上运行
- 使用共享库编译可执行文件时仅链接所需的符号
- 编译 GCC-5.0 OS X 狮子 dyld:找不到符号:__ZNKSt11logic_error4whatEv
- 我正在为学校开发一个小班模板实验室,我的代码无法编译,它给了我一个未解析的外部符号
- GCC 中使用 -O3 的共享库编译不会导出与 -O0 中那样多的符号
- 编译问题LD:不满意的符号
- 在 Mac 上C++编译代码时处理“dyld:惰性符号绑定失败:找不到符号”错误
- 库期望平面命名空间中的符号,尽管使用两级命名空间编译
- C++编译错误LNK2019:未解决的外部符号错误
- C++编译错误(有符号和无符号整数表达式之间的比较)
- 为什么要编译?(无符号字符 *事物 = (无符号字符 *) "YELLOW SUBMARINE" ;)
- C++编译错误:ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v
- 多个条件编译符号
- 如果未设置编译符号,如何排除方法?如何传递可变数量的参数并在函数体中格式化它们