main.cpp
Kod: Zaznacz cały
#include <iostream>
#include <string>
#include <dlfcn.h>
#include "main.h"
kontrolaAplikacji* api = new kontrolaAplikacji();
using namespace std;
int main()
{
/* Stworzenie uchwytu dla biblioteki */
void* uchwyt = dlopen ("./plugin.so", RTLD_LAZY);
/*
Zdefiniowanie typu:
Wskaznik na fukncje, ktora zwraca void
i nie ma nic w argumentach
*/
typedef void (*fun)();
/* Przekazania wskaznika do funkcji start */
fun start = (fun) dlsym(uchwyt, "start");
cout << "Przed wywolaniem: " << api->uzyto << endl;
/* Start funkcji ... */
start();
cout << "Po wywolaniu: " << api->uzyto << endl;
/* Wyładowanie liba */
dlclose(uchwyt);
}
Kod: Zaznacz cały
#include <iostream>
#include "main.h"
extern kontrolaAplikacji* api;
using namespace std;
/*
Stworzenie klasy pluginInfo
Zawarte będą tu informacje o
wtyczce
*/
class pluginInfo {
public:
string nazwaPluga;
string autorPluga;
};
/* Uzupełnienie informacji o wtyczce */
pluginInfo informacje = {
"Pierwsza wtyka",
"Piotr Niełacny"
};
/*
extern "C" potrzebny do tego, aby C++ (g++, Visual)
nie doczepiał różnych dziwnych rzeczy do nazw
chodzi o zasłananie
*/
extern "C" void start()
{
cout << "Wtyczka: " << informacje.nazwaPluga <<
"\nAutor: " << informacje.autorPluga << endl;
api->uzyto = true;
}
Kod: Zaznacz cały
#ifndef MAIN_H
#define MAIN_H
class kontrolaAplikacji {
public:
bool uzyto;
kontrolaAplikacji() { uzyto = false; }
};
#endif
Kod: Zaznacz cały
# Makefile - wtyczki
FLAGS = -g -pedantic -fPIC
all: main.o plugin.so
main.o: main.cpp
g++ main.cpp -o main.o -ldl -pedantic -g
plugin.so: plugin.cpp
g++ -shared plugin.cpp -o plugin.so $(FLAGS)
clean:
rm -f *.so *.o *~
Kod: Zaznacz cały
Przed wywolaniem: 0
zsh: segmentation fault ./main.o
W debugerze widzę tylko tyle, że wskaźnik api po wejściu do biblioteki wskazuje na NULL... Dlaczego nie wskazuje na to co powinien? Chyba, że źle rozumiem extern.