2009-10-07 2 views
2

Salut, je crée un environnement avec Scons. Pour linker plate-forme (lien) de Windows obtient Scons configuration de mon chemin de la bibliothèque de partager avec préfixe - nom du disqueScons ajoute le préfixe de nom de disque à NFS LIBPATH

J'ai bibliothèque NFS:

libs='\\\\share\\lib\\lib' 

Dans scons J'ai:

env.Append(LIBPATH = [libs]) 

résultat est que l'éditeur de liens appelle quelque chose comme ceci:

/LIBP ATH: D: \ share \ lib \ lib

Répondre

1

Il semble que la fonction Ajouter modifie votre entrée. Avez-vous essayé de manipuler 'LIBPATH' via l'interface __set_item__? Essayez:

env['LIBPATH'] += ':'+libs 

ou

env['LIBPATH'] += ':\\\\share\\lib\\lib' 

Aussi, si vous voulez sortir de python \ évasion-enfer, vous pouvez utiliser le préfixe de chaîne r qui signifie « brute » et tous vos \ 's sera passé à travers sans être inquiété.

env['LIBPATH'] += r':\\share\lib\lib' 

EDIT: En réponse au commentaire de l'auteur et pour déboguer cet autre essai:

append_lib_path = r':\\share\lib\lib' 
print 'DEBUG: append_lib_path is', append_lib_path 

print "DEBUG: before appending to env['LIBPATH'], env['LIBPATH'] is ",env['LIBPATH'] 

env['LIBPATH'] += append_lib_path 

print "DEBUG: after appending to env['LIBPATH'], env['LIBPATH'] is ",env['LIBPATH'] 

Si vous voyez la valeur correcte dans env [ « LIBPATH »] sur la dernière impression, alors quelque chose d'autre dans Scons est mangeant votre entrée. Si la chaîne que vous voulez ajouter au chemin lib est incorrecte, essayez de manipuler la chaîne dans l'interpréteur python. Do < Windows start > -> < Exécuter ... >. Puis tapez 'python'. Cela devrait vous donner un terminal python interactif et vous pouvez expérimenter avec la manipulation de chaînes. Si cette séquence de commandes ne fonctionne pas, vous pouvez essayer de trouver votre installation python quelque part et double-cliquer sur le fichier python.exe.

+0

Salut Ross, '' 'produit: "/ I: \ share \ lib \ lib", lorsque j'ajoute de l'espace supplémentaire Au lieu de cela j'ai "/ I \ part \ lib \ lib", ce qui n'est toujours pas correct. Je devrais avoir "/ I \\ part \ lib \ lib" ce backslash supplémentaire est significatif et je ne peux pas l'obtenir. Peu importe combien "\\\\\" (ou r '') je mets avant "partage". – bua

+0

voir les modifications précédentes –

+0

Les valeurs semblent correctes, mais après leur ajout à env ['LIBPATH'], le nom du disque est toujours ajouté. Une seule solution valide que j'ai trouvé pour cela est de: - partage d'utilisation net L: - sur winXP - smbmount .... - sur linux Dans le lot qui appelle scons. Cette même chose s'est produite pour d'autres propriétés, mais je ne me souviens pas maintenant, pour lequel. En tout cas merci pour l'aide Ross. – bua

0

La racine du problème ici est que SCons ajoute les bibliothèques trouvées dans le tableau LIBS à la ligne de commande de l'éditeur de liens - avec le chemin complet. Cela a pour conséquence que l'éditeur de liens enregistre ce chemin d'accès complet dans l'exécutable généré, ce qui est regrettable, surtout si nous construisons des bibliothèques qui seront installées plus tard dans un répertoire système. Je ne suis pas sûr si nous pouvons blâmer SCons pour cela, parce que l'éditeur de liens doit trouver la bibliothèque pour se lier à elle.

Je ne pouvais trouver les deux solutions jusqu'à présent suivantes:

  • construire les libs et l'exécutable dans le même répertoire de construction, déplacer les fichiers générés ensuite (par exemple avec le constructeur Install()).Il en résulte que le nom de la bibliothèque se retrouver dans le lien exécutable
  • contre les bibliothèques déjà installées dans les répertoires système et utiliser les mécanismes pour configurer les dépendances droite

les deux solutions semblent un peu gênant .. ..

PS: (éditer) il existe une solution non-portable cependant. Vous pouvez passer des options spécifiques à l'éditeur de liens. Surtout, sur un système GNU/Linux, vous pouvez définir explicitement le DT_SONAME avec l'option -h. Lorsqu'une bibliothèque contient ce champ DT_SONAME d'ensemble d'explicite, toute référence dans d'autres libs ou exécutables utilisera simplement ce nom - laissant la résolution exacte à l'éditeur de liens au moment de l'invocation. Habituellement, c'est exactement ce que nous voulons, lors de la construction d'une nouvelle bibliothèque à installer plus tard dans le système

Questions connexes