[Libav-user] 答复: Are there any ways to use a lib (built from C++ OpenCV) in Ffmpeg filter?

Perette Barella perette at barella.org
Sat Sep 3 16:59:00 EEST 2016


Sample code attached.


--
Perette Barella • perette at barella.org • 585-286-1312
176 Middlesex Road, Rochester NY 14610

> On 2016年09月02日, at 23:54, R n <flynewdream at hotmail.com> wrote:
> 
> Thanks Perette.
> 
> I did exactly what you suggested for the C and C++ files. (I have two header files, one for C and another is for C++, and the C++ header file includes the C header file. I have one cpp file in which I put the C and C++ source code. I can also split them into two cpp files for clarity). I guess perhaps the problem is in the how I compile the library and how I compile FFmpeg when I call the library from FFmpeg.
> 
> Any suggestions?
> 
> Thanks.
> 
> Rich 
> 
> 
> 
> 
> 发件人: Libav-user <libav-user-bounces at ffmpeg.org <mailto:libav-user-bounces at ffmpeg.org>> 代表 Perette Barella <perette at barella.org <mailto:perette at barella.org>>
> 发送时间: 2016年9月3日 3:38
> 收件人: This list is about using libavcodec, libavformat, libavutil, libavdevice and libavfilter.
> 主题: Re: [Libav-user] Are there any ways to use a lib (built from C++ OpenCV) in Ffmpeg filter?
>  
>> On 2016年09月02日, at 22:32, R n <flynewdream at hotmail.com <mailto:flynewdream at hotmail.com>> wrote:
>> I am writing a C++ library which is based on OpenCV. I want to use it in a Ffmpeg filter (written in C), so I write a wrapper of the library using C. The wrapper consists of a C header file and some C functions which call the C++ functions (in the C++ files). I expect the FFmpeg filter to only include the C header and call the C functions.
>>> However, I get the following error when compiling FFmpeg:
>> .../binutils/2.25/centos6-native/da39a3e/bin/ld: .../mylibrary/0.1/gcc-4.9-glibc-2.20/80414d5/lib/libmylibrary.a(mylibrary_file.cpp.o): undefined reference to symbol '_ZdlPv@@GLIBCXX_3.4'
>> .../libgcc/4.9.x/gcc-4.9-glibc-2.20/024dbc3/lib/libstdc++.so: error adding symbols: DSO missing from command line
> 
> Your approach is correct, but C++ “mangles” function names to make them unique when considering parameters and such.  You need to specify C linkage, so in your .h file, wrap it in extern “C”:
> 
> #ifdef __cplusplus
> #warning is c++
> extern "C" {
> #endif
> char foo (int);
> 
> #ifdef __cplusplus
> }
> #endif
> 
> You need to #include the .h file in the corresponding .cpp file, so the C++ compiler knows not to mangle those particular function names when they’re compiled.
> 
> Perette
> 
> 
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org <mailto:Libav-user at ffmpeg.org>
> http://ffmpeg.org/mailman/listinfo/libav-user <http://ffmpeg.org/mailman/listinfo/libav-user>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20160903/bd95e6dc/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: test.tar
Type: application/x-tar
Size: 32768 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20160903/bd95e6dc/attachment.tar>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://ffmpeg.org/pipermail/libav-user/attachments/20160903/bd95e6dc/attachment-0001.html>


More information about the Libav-user mailing list