Question

MODIFIER: Je suppose que je devrais clarifier, au cas où cela importerait. Je suis sous AIX Unix, je me sers donc des compilateurs VAC - pas de compilateurs gnu. Terminer la modification

Je suis assez rouillé en C / C ++, alors pardonnez-moi s’il s’agit d’une question simple.

Je voudrais extraire des fonctions communes de quelques-uns de mes programmes C et les placer dans des bibliothèques partagées ou des objets partagés. Si je le faisais en Perl, je mettrais mes sous-programmes dans un module Perl et l’utiliserais si nécessaire.

Par exemple, supposons que j'ai cette fonction:

int giveInteger()
{
    return 1034;
}

Évidemment, ce n'est pas un exemple du monde réel, mais si je voulais partager cette fonction, comment procéderais-je?

Je suis sûr que j'ai 2 options:

  1. Mettez ma fonction partagée dans un fichier et compilez-la avec mon programme principal au moment de la compilation. Si jamais j'apportais des modifications à ma fonction partagée, je devrais recompiler mon programme principal.
  2. Mettez ma fonction partagée dans un fichier et compilez-le en tant que bibliothèque partagée (si mes termes sont corrects), et associez mon programme principal à cette bibliothèque partagée. Toute modification apportée à ma bibliothèque partagée (après l'avoir compilée) serait intégrée à mon programme principal au moment de l'exécution sans recompiler mon programme principal.

Ai-je raison de penser cela?

Si oui, comment puis-je compléter l'une ou l'autre de ces méthodes? J'ai beaucoup cherché et je semble trouver des informations sur la manière dont je pourrais avoir mon propre programme lié à la bibliothèque partagée de quelqu'un d'autre, mais pas sur la manière de créer mes propres fonctions partagées et de les compiler de manière à pouvoir les utiliser dans mon propre programme .

Merci beaucoup!

Brian

MODIFIER:

Conclusion

Merci à tous pour votre aide! J'ai pensé ajouter à ce message ce qui fonctionne pour moi (pour les bibliothèques partagées dynamiques sous AIX) afin que d'autres puissent en bénéficier:

Je compile mes fonctions partagées:

xlc -c sharedFunctions.c -o sharedFunctions.o

Puis faites-en un objet partagé:

xlc -qmkshrobj -qexpfile=exportlist sharedFunctions.o
xlc -G -o libsharedFunctions.so sharedFunctions.o  -bE:exportlist

Puis reliez-le à un autre programme:

xlc -brtl -o mainProgram mainProgram.c  -L. -lsharedFunctions

Et un autre commentaire m'a aidé à trouver ce lien, qui a également aidé: http: //publib.boulder.ibm.com/infocenter/comphelp/v7v91/topic/com.ibm.vacpp7a.doc/proguide/ref/compile_library.htm

Merci encore à tous ceux qui m'ont aidé!

Était-ce utile?

La solution

Oui, vous avez raison. Le premier s'appelle une bibliothèque statique , le second une bibliothèque partagée , car le code n'est pas lié à l'exécutable à la compilation, mais à chaque fois que votre programme est chargé.

Bibliothèque statique

Compilez le code de votre bibliothèque comme suit:

gcc -c *.c

Le -c indique au programme de ne pas lier le fichier objet, mais vous laisse simplement des fichiers objet pour chaque fichier .c compilé. Maintenant, archivez-les dans une bibliothèque statique:

ar rcs libmystuff.a *.o 

man ar vous expliquera la signification des options rcs. À présent, libmystuff.a est un fichier rchive (vous pouvez l'ouvrir avec certains visualiseurs de fichiers zip) qui contient ces fichiers objets, ainsi qu'un index de symboles pour chaque fichier objet. Vous pouvez le lier à votre programme:

gcc *.c libmystuff.a -o myprogram

Votre programme est maintenant prêt. Notez que l'ordre dans lequel les bibliothèques statiques apparaissent dans la commande est important. Consultez ma commande de liens .

Bibliothèque partagée

Pour une bibliothèque partagée, vous allez créer votre bibliothèque avec

gcc -shared -o libmystuff.so *.c

C'est tout ce dont vous avez besoin, libmystuff.so est maintenant un fichier s manipulé o . Si vous souhaitez lier un programme à celui-ci, vous devez le placer dans un répertoire répertorié dans le fichier /etc/ld.so.conf ou indiqué par - L passe à GCC, ou figure dans la variable LD_LIBRARY_PATH. Lors de la liaison, vous coupez le préfixe lib et le suffixe .so du nom de la bibliothèque que vous indiquez à gcc.

gcc -L. -lmystuff *.c -o myprogram

En interne, gcc passera simplement vos arguments à l'éditeur de liens GNU. Vous pouvez voir quels arguments il passe en utilisant l'option - ### : Gcc affichera les arguments exacts donnés à chaque sous-processus.

Pour plus de détails sur le processus de liaison (comment certaines tâches sont effectuées en interne), consultez mon éditeur de liens Linux GCC réponse.

Autres conseils

Vous avez une troisième option. En général, votre compilateur C ++ devrait être capable de lier des routines en C. Les options nécessaires peuvent varier d’un compilateur à l’autre, donc R votre bien M, mais vous devriez pouvoir compiler avec g ++ comme ici:

$ g++ -o myapp myapp.cpp myfunc.c giveint.c

... ou compiler séparément

$ gcc -c myfunc.c
$ gcc -c giveint.c
$ g++ -c myapp.cpp
$ g++ -o myapp myapp.o myfunc.o

Vous devez également inclure votre déclaration des fonctions; vous faites cela en C ++ en tant que

extern "C" {
    int myfunc(int,int);
    int giveInterger(void);
}

Vous devez faire la distinction entre la recompilation et la création de liens.

Si vous insérez giveInteger () dans une bibliothèque (archive) distincte, puis le modifiez ultérieurement, vous devrez (évidemment) recompiler le fichier source dans lequel elle est définie, et < em> relier tous les programmes qui l'utilisent; mais vous n'aurez pas besoin de recompiler de tels programmes [1].

Pour une bibliothèque partagée, vous devez recompiler et relier la bibliothèque; mais vous ne devrez pas relier ni recompiler aucun des programmes qui l'utilisent.

La construction de bibliothèques partagées C ++ sous AIX était compliquée; vous deviez utiliser le script shell makeC ++ SharedLib. Mais avec VAC 5.0 et 6.0, cela est devenu assez facile. Je crois que tout ce que vous avez à faire est de: [2]:

xlC -G -o shr.o giveInteger.cc
xlC -o myapp main.cc shr.o

[1] Si vous écrivez le fichier Makefile correct (pratique recommandée), tout cela se produira automatiquement lorsque vous tapez make .

[2] Certaines fonctionnalités d'AIX peuvent compliquer les choses: par défaut, les bibliothèques partagées sont chargées en mémoire et "stick". là jusqu'au redémarrage ultérieur. Vous pouvez donc reconstruire le shr.o, relancer le programme et observer "vieux". version de la bibliothèque en cours d'exécution. Pour éviter cela, une pratique courante consiste à rendre shr.o world-illeadable:

chmod 0750 shr.o
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top