Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

extern C return class object

Tags:

c++

c

extern-c

I want to have a plugin, with a simpler name to resolve in other C++ code.

class B {
};

extern "C" B foo(); // to avoid name mangling in order to be loaded by dlsym

And in the other part of the program (which is also in C++ and shares the same definition of class B with the plugin):

B (*func)();
func = dlsym("/path/to/so", "foo");
B m = func();

Will such code cause any problem, i.e. is it allowed (by standard) to use a C++ class as parameter or return type in an extern "C" function? It seems to work on my gcc, but what about the others?

like image 678
csslayer Avatar asked Jan 27 '13 15:01

csslayer


2 Answers

That should work, with a few conditions:

  • If you intend to switch the definition of class B to something else, it won't work. The only thing you can change is the definition of foo().
  • Both the plugin and the loading program must agree on the interface of class B on a binary level. Switching compilers (including version and some flags) can change this interface.
  • You obviously have to cast the returnvalue of dlsym() in C++.
  • Using classes in C is not possible.
like image 138
Ulrich Eckhardt Avatar answered Oct 02 '22 14:10

Ulrich Eckhardt


Declaring foo() as extern "C" will of course allow you to load it through dlsym() using the actual, unmangled function name, but otherwise will have no effect on how you use that function after you load it.

The usual rules still apply. If you break binary compatibility of either foo() or class B, you will need to recompile the plugin, just as you would have to recompile it if it was a regular, non-runtime loaded dynamic library.

like image 25
Nikos C. Avatar answered Oct 02 '22 15:10

Nikos C.