Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create automatic C wrapper for C++ library?

Tags:

c++

c

abi

wrapper

Let say I have a C++ DLL. AFAIK, there is no widely-adopted ABI standard for C++, therefore to make sure it works and does not depend on the compiler of the target application I would need to wrap my library in a C interface.

Are there any tools that can automatically generate such interface? Would also be nice if they could generate wrappers around C interface to look as if they are original C++ objects, e.g.

Foo* f = new Foo();  // FooWrapper* fw = Foo_create();
f->bar("test");      // Foo_bar(fw, "test")

translates into C functions that are invoked in my library using generated C ABI. I understand that C++ is fairly complicated language and not everything can be easily wrapped in a C interface, but I was wondering if there are any such solutions that even support a subset of the C++ language (maybe with the help of some manually written IDL/XML files)?

like image 380
Sergiy Belozorov Avatar asked Jul 18 '13 23:07

Sergiy Belozorov


People also ask

What is a C wrapper library in C++?

This C-wrapper technique can also be used for creating C-libraries in C++, which can be loaded from any programming languages (Python, Ruby, Lisp, …) via FFI (Foreign Function Interface) or by linking against the C-wrapper shared library in the case of compiled language such as Golang, Rust or D-lang.

What is cwrap in C language?

Cwrap is a Go wrapper generator for C libraries. No Cgo types exposed out of the wrapper package, and uses as less allocation/copy as possible. C name prefix mapped to Go packages, and a wrapper package can import another wrapper package. Follows Go naming conventions. C union.

Is there a C wrapper for the thin C-89 API?

A C++ SDK (Software Development Kit) wrapping the thin C-89 API can also be provided for making the library usage easier by C++ client codes. This sample code provides a C wrapper to the QT5 Widgets GUI library.

What is a wrapper in Lua programming?

The user data is returned to Lua and when Lua calls a wrapper function the user data will be passed to the wrapper C function. The below wrapper does a bit more than simply wrapping the C library. It extends it a bit by adding a name to the counter.


1 Answers

If you want a way to make C++ code callable from other compilers/standard libraries, you can use cppcomponents from https://github.com/jbandela/cppcomponents. Full disclosure - I am the author of the library.

Here is a simple hello world example

First make a file called library.h In this file you will define the Component

#include <cppcomponents/cppcomponents.hpp>

struct IPerson
:public cppcomponents::define_interface<cppcomponents::uuid<0xc618fd04,0xaa62,0x46e0,0xaeb8,0x6605eb4a1e64>>
{

    std::string SayHello();

    CPPCOMPONENTS_CONSTRUCT(IPerson,SayHello);



};

inline std::string PersonId(){return "library!Person";}

typedef cppcomponents::runtime_class<PersonId,cppcomponents::object_interfaces<IPerson>> Person_t;
typedef cppcomponents::use_runtime_class<Person_t> Person;

Next create library.cpp In this file you will implement the interface and component

#include "library.h"

struct PersonImplementation:cppcomponents::implement_runtime_class<PersonImplementation,Person_t>
{

    std::string SayHello(){return "Hello World\n";}

};

CPPCOMPONENTS_DEFINE_FACTORY(PersonImplementation);

Finally here is you main program (call it example1.cpp) that uses your implementation

#include "library.h"
#include <iostream>

int main(){
    Person p;
    std::cout << p.SayHello();

}

To build the program you will need to download cppcomponents (just clone from the git link above). It is a header only library and needs only a c++11 compiler.

Here is how you would build it on Windows

cl /EHsc example1.cpp /I pathtocppcomponents

g++ -std=c++11 library.cpp -o library.dll -shared -I pathtocppcomponents

where pathocppcomponents is the directory of cppcomponents. I am assuming you have cl and g++ in your path.

To run the program, make sure library.dll is in the same directory as example1.exe and run example1.exe

This library requires fairly compliant c++11 support, so it needs MSVC 2013 Preview, and at least g++ 4.7. This library works on both Windows and Linux.

like image 158
John Bandela Avatar answered Sep 27 '22 22:09

John Bandela