【发布时间】:2011-01-03 15:43:56
【问题描述】:
Snow Leopard 上的 g++ 在以下代码中引发链接错误
test.cpp
#include <iostream>
using namespace std;
#include <libavcodec/avcodec.h> // required headers
#include <libavformat/avformat.h>
int main(int argc, char**argv) {
av_register_all(); // offending library call
return 0;
}
当我尝试使用以下命令编译时
g++ test.cpp -I/usr/local/include -L/usr/local/lib \
-lavcodec -lavformat -lavutil -lz -lm -o test
我得到了错误 未定义的符号: “av_register_all()”,引用自: ccUD1ueX.o 中的 _main ld:未找到符号 collect2: ld 返回 1 个退出状态
有趣的是,如果我有一个等效的 c 代码, 测试.c
#include <stdio.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
int main(int argc, char**argv) {
av_register_all();
return 0;
}
gcc 编译得很好
gcc test.c -I/usr/local/include -L/usr/local/lib \
-lavcodec -lavformat -lavutil -lz -lm -o test
我使用的是 Mac OS X 10.6.5
$ g++ --version
i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)
$ gcc --version
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)
FFMPEG 的 libavcodec、libavformat 等是 C 库,我在我的机器上构建了它们,如下所示:
./configure --enable-gpl --enable-pthreads --enable-shared \
--disable-doc --enable-libx264
make && sudo make install
正如所料,libavformat 确实包含符号 av_register_all
$ nm /usr/local/lib/libavformat.a | grep av_register_all
0000000000000000 T _av_register_all
00000000000089b0 S _av_register_all.eh
我倾向于相信 g++ 和 gcc 对我机器上的库有不同的看法。 g++ 无法选择正确的库。有什么线索吗?
【问题讨论】:
标签: macos g++ ffmpeg linker-errors