Uno/Cpp/Tutorials/Global References/Samples

From Apache OpenOffice Wiki
< Uno‎ | Cpp‎ | Tutorials‎ | Global References
Revision as of 23:07, 17 March 2010 by Ivanm (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

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
Personal tools