C++ - biblioteka dynamiczna, wskaznik wskazuje na NULL

Potrzebujesz pomocy z C, C++, perl, python, itp.
LiTE
Beginner
Posty: 208
Rejestracja: 25 marca 2008, 13:22
Lokalizacja: Nowa Ruda

C++ - biblioteka dynamiczna, wskaznik wskazuje na NULL

Post autor: LiTE »

Chciałem napisać bardzo prosty prototyp obsługi wtyczek w C++. Stworzyłem do tego 3 pliki źródłowe + Makefile.

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);
}
plugin.cpp

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;
}
main.h

Kod: Zaznacz cały

#ifndef MAIN_H
#define MAIN_H
	
	class kontrolaAplikacji {
	public:
		bool uzyto;
		kontrolaAplikacji() { uzyto = false; }
};

#endif
Makefile

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 *~
Uruchomienie wywala

Kod: Zaznacz cały

Przed wywolaniem: 0
zsh: segmentation fault  ./main.o
Nie mogę dojść do tego, co robię źle. Proszę o pomoc.
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.
ODPOWIEDZ