[Geany-devel] Geany Newsletter Issue #5
Thomas Martitz
thomas.martitz at xxxxx
Mon May 28 21:24:02 UTC 2012
Am 28.05.2012 13:27, schrieb Lex Trotman:
>
> This doesn't actually call the C++ constructors/destructors in the way
> they would be in normally be if the plugin had been statically linked.
>
> This simply labels a C function to be called at dlopen time. It may
> be used to do some initialisation, but you would have to manually call
> each constructor, ... too error prone, Franks advice to create
> everything dynamically is sound.
>
I meant to say that global/static constructors/destructors are in fact
called when a library is dlopened(), regardless of the language of
calling code.
Anyway, I thought an example illustrates it better:
> $ cat test.c
> #include <dlfcn.h>
> #include <stdlib.h>
> #include <stdio.h>
> int main()
> {
> void* h = dlopen("/tmp/foo/libtestcpp.so", RTLD_NOW);
> if (!h) { printf("no lib %s\n", dlerror()); exit(-1); }
> void (*fn)(void) = dlsym(h, "hello");
> if (!fn) exit(-2);
> fn();
> dlclose(h);
> return 0;
> }
>
>
> $ gcc -o test test.c -ldl -g
>
>
> $ cat test.cpp
> #include <iostream>
>
> namespace std {
>
> class Test
> {
> public:
> Test() { cout << "Hello from Test" << endl; }
> ~Test() { cout << "Bye from Test" << endl; }
> };
>
> static Test test;
>
> }
>
> extern "C" {
>
> #include <stdio.h>
>
> void hello(void)
> {
> printf("hello from extern C function\n");
> }
>
> }
>
>
> $ gcc -o libtestcpp.so -shared -fPIC test.cpp -g -lstdc++
> -Wl,--no-undefined
>
>
> $ ./test
> Hello from Test
> hello from extern C function
> Bye from Test
FWIW, does anyone know why I needed to link libstdc++ explicitely in my
testing?
Best regards.
More information about the Devel
mailing list