2014-06-10 4 views
1

je besoin d'un mécanisme de construction qui peut être abstraitement décrit comme ceci:bâtiment avec soit la version du système ou une version locale d'une bibliothèque

  • compiler et lier le code avec la version du système d'une bibliothèque, ou
  • compiler et lier le code avec une version locale de la même bibliothèque

en d'autres termes:

J'utilise une bibliothèque dans mon programme et je dois tester mo plus d'une version de cette bibliothèque. J'ai besoin de tester la version du système, installée dans les répertoires du système, mais aussi les versions plus anciennes ou plus récentes de la même bibliothèque que j'ai téléchargée, construite et installée moi-même dans les répertoires locaux.

Ma méthodologie actuelle: en fonction de la commande utilisateur, je laisse soit -I et -L vide, soit je les mets à pointer vers les répertoires locaux de la version choisie de la bibliothèque. Lorsque j'utilise la version du système, cela fonctionne correctement, car les chemins de recherche par défaut -I et -L du compilateur pointent vers la version système de la bibliothèque.

Mais lorsque je sélectionne une version locale, en fonction de l'ordre de compilation/lien (qui est au moins difficile à comprendre), la construction peut se faire contre le système ou la bibliothèque locale.

De plus, lorsque j'exécute le programme, j'ai besoin de définir LD_LIBRARY_PATH dans le répertoire de la bibliothèque locale si je veux tester une version de bibliothèque locale.

Existe-t-il un moyen propre de générer puis de lancer le système ou les versions locales de la bibliothèque? Pour éviter ce comportement non déterministe, je peux directement lier avec les fichiers .a (en évitant les chemins de recherche -L) mais je peux toujours avoir des problèmes avec les chemins d'inclusion, car la compilation peut utiliser un en-tête de version système ou un local en silence. J'utilise Scons avec g ++ si cela aide.

Existe-t-il une méthode alternative?

Fondamentalement, je dois faire:

scons 
./a.out 

(fonctionne avec la version du système de la bibliothèque)

scons library=1.0 
./a.out 

(fonctionne avec la version 1.0 de la bibliothèque)

scons library=3.0 
./a.out 

(fonctionne avec la version 3.0 de la bibliothèque)

Répondre

1

Je pense que cela peut être résolu comme ceci:

Si la compilation contre la version de la bibliothèque locale utiliser -I<include path>, -L<library path> et -Wl,-rpath=<library path>.

Sinon, utilisez les paramètres système par défaut.D'après ce que j'ai appris du canal IRC de GCC, les chemins -I et -L devraient prévaloir sur les chemins du système. En outre, vérifiez http://www.scons.org/wiki/UsingOrigin pour une explication sur l'utilisation de rpath (et $ ORIGIN) avec SCons.

Questions connexes