2009-08-21 4 views
5

J'ai un projet C++ (g ++/raw Makefile) conçu pour linux, je lia statiquement tout ce qui fonctionnait bien depuis des lustres. Maintenant, je veux construire des binaires à la fois statiquement et dynamiquement liés. La commande suivante est utilisée dans mon Makefile pour créer la bibliothèque dynamique (disons libtest):comment utiliser ma propre bibliothèque dynamique dans linux (Makefile)

$ (CXX) -shared -Wl, -soname, libtest.so.1 -o libtest.so.1.0.0 $ (LIBTEST_OBJS)

la sortie est libtest.so.1.0.0 qui porte le nom si libtest.so.1

J'ai trouvé au moins un lien symbolique libtest.so -> libtest.so.1.0.0 est requis pour lier mon programme client qui utilise réellement la bibliothèque libtest.so.1.0.0 ci-dessus générée.

Ici, ma question est de savoir si je veux construire mon logiciel, quelle est la manière standard de gérer le lien symbolique ci-dessus? Clairement, je ne veux pas ce truc supplémentaire dans mon répertoire source, mais il est nécessaire de construire mon binaire client, dois-je le créer en tant que lien temporaire pour construire le client, puis le supprimer une fois terminé? ou dois-je créer un répertoire pour héberger la bibliothèque generate .so et ses liens et y laisser tout jusqu'à ce que je fasse "make install" pour les installer dans d'autres répertoires spécifiés? Sera cool à présent quelle est la manière standard de le faire.

Ou peut-être que la manière dont je génère des bibliothèques est incorrecte? dois-je juste générer libtest.so (en tant que bibliothèque réelle, pas un lien) pour lier mon exécutable, puis renommer la bibliothèque et créer ces liens en faisant `` make install ''?

toute contribution sera appréciée. :)

Répondre

1

Certainement pas générer libtest.so comme un lien réel. En général, l'installation des fichiers de développement de la bibliothèque partagée installe les fichiers .h et crée un lien symbolique libtest.so dans le script d'installation que vous devez écrire.

Si vous n'installez pas les fichiers de développement, mais seulement en utilisant la bibliothèque dans votre processus de construction de votre binaire, vous créez simplement le lien symbolik à partir de votre fichier makefile.

Il n'y a pas beaucoup de standard ici, certains préfèrent construire des artefacts dans un répertoire de construction séparé, ne se soucient pas de savoir s'il est construit dans le répertoire source. Je construirais cependant dans un répertoire séparé, et garderais le répertoire source propre des fichiers .o/.so/exécutables.

Vous pouvez trouver des informations utiles here

1

Ma suggestion est d'utiliser libtool qui gère des situations comme ça.

+0

+ 1 L'utilisation de libtool vous facilitera la tâche si vous décidez de le porter de Linux à autre chose - libtool gère tous les problèmes de bibliothèques partagées qui dépendent de la plateforme. –