[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [linux] .so and so on ... (C/C++ programmation)
> J'aimerais bien faire un genre de plugin facile à mettre en oeuvre --> des .so
> jusque là le concept me parait bien mais la question cruciale est :
héhéhé, je viens justement de faire ça au boulot. J'ai testé ça sur plusieurs
plateformes (Linux, HP-UX, AIX) ;-))
Bonne question au bon moment ;)
> 1) Comment qu'on crée des .so (ar cru ?)
g++ -fpic -c plugin.cxx
ou
gcc -fpic -c plugin.c
ld -shared -o plugin.so plugin.o
> 2) Comment qu'on les charge dans son programme ? (surtout que si on les
> rajoutes, on veut pas forcément recompiler tout le prog)
Exemple en C++:
----- plugin.h:
class Plugin {
public:
void start() = 0;
};
----- hello_plugin.cxx:
#include <iostream>
#include "plugin.h"
class HelloPlugin : public Plugin {
public:
void start() {
std::cout << "hello world" << std::endl;
}
};
extern "C" {
Plugin* getPlugin() {
return new HelloPlugin();
}
}
----- loader.cxx:
#include <plugin.h>
#include <dlfcn.h>
int main(int argc, char** argv) {
char* plugin_filename=argv[1];
void* dlh = dlopen(plugin_filename, RTLD_NOW);
if (!dlh) { std::cerr << dlerror() << std::endl; return 1; }
Plugin* (*loader)();
loader = dlsym(dlh, "getPlugin");
if (!loader) { std::cerr<<dlerror()<<std::endl; return 2; }
Plugin* plugin = (*loader)();
plugin->start();
dlclose(dlh);
return 0;
}
-----
Et voilà, reste plus qu'à:
g++ -fpic -c hello_plugin.cxx
ld -shared -o hello_plugin.so hello_plugin.o
g++ -o loader -ldl loader.cxx
./loader ./hello_plugin.so
Faut juste savoir que si tu ne donnes pas un chemin
complet à dlopen(), il va regarder dans LD_LIBRARY_PATH
pour trouver le .so
--
-o) / Pascal Bleser ATOS Origin|
/\\ \ e-Business Platform Aachen, Germany|
_\_v \<guru@linuxbe.org> <pbleser@atosorigin.com>|
---------------------------------------------------|
rm -rf /bin/laden || cat usa >/dev/null :
---------------------------------------------------'
[ Soyez précis dans vos sujets svp afin de déterminer directement ]
[ le type de demande... ]
[ Pour vous (dés)inscrire, aller sur http://unixtech.be/ml.php ]
[ Archives de la mailing list: http://archives.unixtech.be/linux/ ]
[ http://unixtech.be Contact: listmaster@unixtech.be ]