2010-12-06 18 views
2

c et je l'utilise pour générer x.so bibliothèque partagée en xc je veux utiliser quelques fonctions qui sont dans le module principal, (dir contenant fichiers principaux et exe), genre de dépendance récursive. est-il un moyen de le faire (sans copier ces fonctions dans x.c)? j'ai lu au sujet de -rdynamic, mais je n'ai pas pu l'obtenir pleinement. Lorsque je compile, je reçois 'somefunc' non déclaré. (Somefunc est dans le module principal, je l'ai fait extern somefunx à xc, mais n'a pas fonctionné) s'il vous plaît laissez-moi savoir mercien C, comment utiliser la fonction du fichier programme principal dans un fichier de bibliothèque partagée

+0

Quel OS et compilateur? Qu'avez-vous fait pour essayer d'utiliser 'somefunc()'? Vous ne devriez pas avoir de difficulté à trouver une version qui soit très réduite et que vous pouvez publier ici. –

Répondre

2

Vous pouvez définir les méthodes affectées dans votre bibliothèque partagée pour reprendre l'appel des arguments de pointeur de fonction, puis au moment de l'appel, passez les fonctions du module principal en arguments. Par exemple.

// Library 
void dosomething (int arg, void (*callback)(void)) { ... } 

// Main module 
void called_from_lib(void) { ... } 

dosomething(10, called_from_lib); 
0

Cela ressemble à unix. Il existe une fonction, dlopen(), qui vous permet d'appeler dynamiquement une fonction dans une bibliothèque sans la référencer au moment de la compilation et sans la lier au programme. dlopen() est POSIX, et devrait donc être sur n'importe quelle boîte unix moderne.

Exemple ici:

http://www.dwheeler.com/program-library/Program-Library-HOWTO/x172.html 

Il y a aussi LD_LIBRARY_PATH. Cette variable d'environnement vous permet d'utiliser le même code, mais vous permet de remplacer dans une bibliothèque qui n'était pas là au moment de la compilation. Ce n'est pas exactement ce que vous demandez, mais on peut faire quelque chose comme utiliser des bibliothèques partagées ad hoc sans avoir recours à dlopen. Certains systèmes comme HPUX prennent également en charge SHLIB_PATH qui fait la même chose.