最近软件工程开发中需要使用到FFMPEG库中一些接口,编码后编译报出如下接口为“undefined reference”的问题:
一开始怀疑是FFMPEG库编译的问题,有重新编译了一下,分别编译了x264和ffmpeg,
编译x264
./configure --enable-shared --disable-asm --enable-pthreads --enable-pic --prefix=$PWD/../install-x86
编译ffmpeg
./configure --enable-shared --disable-static --enable-libx264 --disable-asm --enable-pic --enable-pthreads --enable-ffmpeg --enable-gpl --disable-ffplay --enable-swscale --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-stripping --extra-cflags=-I$PWD/../install-x86/include --extra-ldflags=-L$PWD/../install-x86/lib --prefix=$PWD/../install-x86
编译比较简单,一次成功,然后通过nm -C libswscale.so | grep sws_getContext查看相关接口也是可以导出的,证明库编译是没有问题的。
解决问题过程如下:
1、想到ffmpeg是C语言编写的库,单独写个调用的测试源文件,例如main.cpp,调用相关接口,编译就报上述描述的问题,尝试将main.cpp修改为main.c,编译,发现编译成功。
于是怀疑是C与C++接口调用兼容性问题,并且进入 swscale.h文件中查看,
相关的接口导出形式如上。
2、修改main.c为main.cpp,并在include的时候增加extern C的标识,
重新编译工程,发现编译通过。
因此总结如下:在C++的开发工程中调用C接口,编译链接遇到接口“undefined reference”的问题,在确保相关接口确实导出到库中是,一般是代码中C++与C接口调用兼容性的问题,可以通过在include头文件增加extern C的标识即可解决。