我正在尝试从C ++应用程序链接到ffmpeg的libswresample。我在Mac OS X 10.9上通过Homebrew安装了ffmpeg。一个简单的测试应用程序链接,如果它被编译为C,但如果它被编译为C ++则不会。以下是示例代码:
#include <stdio.h>
#include <libswresample/swresample.h>
int main()
{
swr_alloc();
printf("Hello world\n");
return 0;
}
使用clang -I/usr/local/include -L/usr/local/lib -lswresample -o hello hello.c
编译为C时,会按预期创建应用程序。使用clang++ -I/usr/local/include -L/usr/local/lib -lswresample -o hello hello.cc
使用C ++编译时,会导致如下错误:
Undefined symbols for architecture x86_64:
"swr_alloc()", referenced from:
_main in hello-9jqOY4.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
但正在运行nm -a /usr/local/lib/libswresample.dylib
包括000000000000d8a9 T _swr_alloc
和file /usr/local/lib/libswresample.dylib
会显示/usr/local/lib/libswresample.dylib: Mach-O 64-bit dynamically linked shared library x86_64
,我认为这是预期的。我在使用gcc / g ++编译示例时遇到同样的问题,并且在使用clang或gcc编译 ffmpeg 时我也有同样的问题,这让我认为那里只是我不知道关于链接的东西应该是显而易见的,但我没有找到任何引用,表明它应该是不同的链接C ++与C的库,并链接其他库(例如,sox)设置相同的困难。
由于从libstdc ++到libc ++的更改,我看到了与Mac OS X 10.9中的链接问题相关的帖子,但添加-stdlib=libstdc++
或-stdlib=libc++
似乎没有任何区别。添加-mmacosx-version-min=10.6
或10.9
非常感谢任何帮助。
答案 0 :(得分:5)
您必须通知编译器它应该使用C样式名称管理。 http://en.m.wikipedia.org/wiki/Name_mangling
extern "C"
{
#include <libswresample/swresample.h>
}