[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  ]