我试图从C++应用程序链接到ffmpeg的libswresample.我在Mac OS X 10.9上通过Homebrew安装了ffmpeg.一个简单的测试应用程序链接,如果它被编译为C,但如果它被编译为C++则不会.以下是示例代码:
#include#include int main() { swr_alloc(); printf("Hello world\n"); return 0; }
当编译为C时,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
会导致如下错误:
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)对于相同的设置没有任何困难.
我已经看过与Mac OS X 10.9中的链接问题相关的帖子,因为从libstdc ++到libc ++的变化,但添加-stdlib=libstdc++
或-stdlib=libc++
似乎没有区别.添加-mmacosx-version-min=10.6
或添加也没有区别10.9
.
任何帮助是极大的赞赏.
您必须通知编译器它应该使用C样式名称mangeling. http://en.m.wikipedia.org/wiki/Name_mangling
extern "C" { #include <libswresample/swresample.h> }