Uno/Cpp/Tutorials/Global References/Samples
From Apache OpenOffice Wiki
< Uno | Cpp | Tutorials | Global References
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Foo.hxx
struct Foo {
void * m_dlhandle;
Foo();
~Foo();
void openBar(char const * libName);
};
extern "C" void openBar(char const * libName);
Bar.cxx
#include <iostream>
struct Bar {
int m_a;
Bar();
~Bar();
};
Bar::Bar() : m_a(1) {
std::cerr << "Bar::Bar()" << std::endl;
}
Bar::~Bar() {
m_a = 0;
std::cerr << "Bar::~Bar()" << std::endl;
}
static Bar bar;
extern "C" int Bar_checkValid() {
return bar.m_a;
}
Foo.cxx
#include "Foo.hxx"
#include <iostream>
#include <dlfcn.h>
Foo::Foo() : m_dlhandle(RTLD_DEFAULT) {
std::cerr << "Foo::Foo()" << std::endl;
}
Foo::~Foo() {
std::cerr << "Foo::~Foo()" << std::endl;
int (*Bar_checkValid )() = (int (*)())dlsym(m_dlhandle, "Bar_checkValid");
if (Bar_checkValid())
std::cerr << "\tBar is valid -> statics are OK!" << std::endl;
else
std::cerr << "\tBar is invalid -> statics are BAD!" << std::endl;
if (m_dlhandle) {
std::cerr << "\tclosing Bar..." << std::endl;
dlclose(m_dlhandle);
}
}
void Foo::openBar(char const * libName) {
m_dlhandle = dlopen(libName, RTLD_NOW);
std::cerr << "Foo::openBar(char const * libname)" << "- handle:" << m_dlhandle << std::endl;
}
extern "C" void openBar(char const * libName) {
static Foo foo;
foo.openBar(libName);
}
dlopen_cBar.cxx
#include "Foo.hxx"
static Foo foo;
int main() {
foo.openBar("libBar.c.so");
return 0;
}
dlopen_cxxBar.cxx
#include "Foo.hxx"
static Foo foo;
int main() {
foo.openBar("libBar.cxx.so");
return 0;
}
dlopen_cxxBar_uexit.cxx
#include "Foo.hxx"
#include <unistd.h>
static Foo foo;
int main() {
foo.openBar("libBar.cxx.so");
_exit(0);
}
dlopen_cxxFoo.cxx
#include "Foo.hxx"
#include <dlfcn.h>
#include <iostream>
int main() {
void * dlhandle = dlopen("libFoo.cxx.so", RTLD_NOW);
std::cerr << "main" << "- handle(libFoo.cxx.so):" << dlhandle << std::endl;
void (* openBar)(char const *) = (void (*)(char const * libNanme))dlsym(dlhandle, "openBar");
openBar("libBar.cxx.so");
dlclose(dlhandle); // Please note how important this is, not calling it renders
// this test invalid!
return 0;
}
dlopen_cxxFoo_wo_closing.cxx
#include "Foo.hxx"
#include <dlfcn.h>
#include <iostream>
int main() {
void * dlhandle = dlopen("libFoo.cxx.so", RTLD_NOW);
fprintf(stderr, "main - handle(libFoo.cxx.so): %p\n", dlhandle);
void (* openBar)(char const *) = (void (*)(char const * libNanme))dlsym(dlhandle, "openBar");
openBar("libBar.cxx.so");
//dlclose(dlhandle); // Please note how important this is, not calling it renders
// this test invalid!
return 0;
}
localFoo.cxx
#include "Foo.hxx"
#include <dlfcn.h>
#include <iostream>
int main() {
void * dlhandle = dlopen("libBar.cxx.so", RTLD_NOW|RTLD_GLOBAL);
std::cerr << "main" << "- handle(libBar.cxx.so):" << dlhandle << std::endl;
static Foo foo;
foo.m_dlhandle = dlhandle;
return 0;
}
plain.cxx
#include "Foo.hxx"
static Foo foo;
int main() {
return 0;
}
.SUFFIXES: ifeq ($(VENDOR),sun) CC := cc CXX := CC SHARED := -G CPPRT := -lCstd CFLAGS := -KPIC RPATH := -R. else CC := gcc CXX := g++ SHARED=-shared CPPRT := CFLAGS := -fpic RPATH := -Wl,-rpath,. endif LINK_CC := $(CC) $(RPATH) LINK_CC_LIB := $(LINK_CC) $(SHARED) $(RPATH) LINK_CXX := $(CXX) $(CPPRT) $(RPATH) LINK_CXX_LIB := $(LINK_CXX) $(SHARED) $(RPATH) All: run build: \ plain.cxx.bin \ dlopen_cBar.cxx.bin libBar.c.so \ dlopen_cxxBar.cxx.bin \ dlopen_cxxFoo.cxx.bin \ libBar.cxx.so \ libFoo.cxx.so \ dlopen_cxxBar_uexit.cxx.bin \ localFoo.cxx.bin \ dlopen_cxxFoo_wo_closing.cxx.bin run: build ./plain.cxx.bin ./dlopen_cBar.cxx.bin ./dlopen_cxxBar.cxx.bin ./dlopen_cxxFoo.cxx.bin ./dlopen_cxxBar_uexit.cxx.bin ./localFoo.cxx.bin ./dlopen_cxxFoo_wo_closing.cxx.bin clean: rm -f *.o *.so *.bin .PHONY: All build run clean %.cxx.o: %.cxx $(CXX) -g -c $(CFLAGS) $^ -o $@ %.c.o: %.c $(CC) -g -c $(CFLAGS) $^ -o $@ lib%.c.so: %.c.o $(LINK_CC_LIB) $^ -o $@ lib%.cxx.so: %.cxx.o $(LINK_CXX_LIB) $^ -o $@ %.cxx.bin: %.cxx.o $(LINK_CXX) $^ -o $@ -ldl plain.cxx.bin: plain.cxx.o Foo.cxx.o libBar.cxx.so dlopen_cBar.cxx.bin: dlopen_cBar.cxx.o Foo.cxx.o dlopen_cxxBar.cxx.bin: dlopen_cxxBar.cxx.o Foo.cxx.o dlopen_cxxFoo.cxx.bin: dlopen_cxxFoo.cxx.o localFoo.cxx.bin: localFoo.cxx.o Foo.cxx.o dlopen_cxxBar_uexit.cxx.bin: dlopen_cxxBar_uexit.cxx.o Foo.cxx.o dlopen_cxxFoo_wo_closing.cxx.bin: dlopen_cxxFoo_wo_closing.cxx.o