将ffmpeg的libswresample与MacOS X 10.9与C ++链接起来

时间:2014-01-08 06:42:19

标签: c++ macos ffmpeg

我正在尝试从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_allocfile /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.610.9

也没有区别

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

您必须通知编译器它应该使用C样式名称管理。 http://en.m.wikipedia.org/wiki/Name_mangling

extern "C"
{
#include <libswresample/swresample.h>
}