SCons pour faire une bibliothèque partagée (.donc) avec une bibliothèque statique (.a)
Je vais essayer d'obtenir SCons pour faire une bibliothèque partagée. L'un des éléments allant dans le .so
est un .a
statique lib.
J'ai une ligne comme:
env_2.SharedLibrary('libstuff.so', \
Split("""stuff.cxx mylib/libMine.a""")
Et lors de l'exécution, j'ai cette erreur:
scons: *** Source file: mylib/libMine.a \
is static and is not compatible with shared target: libstuff.so
Cependant, je sais qu'une bibliothèque partagée peut être fait à partir de la .a
via une commande comme:
g++ -m32 -shared -o libstuff.so stuff.o mylib/libMine.a
Des idées sur l'obtention de ce travail ou de solution de contournement serait grandement apprécié.
Liés à la question: Comment puis-je obtenir scons pour mettre une corde de plus -shared
sur la ligne de commande de LIAISON pour la Program()
appel? Si je pouvais faire cela, je pense que ça pourrait répondre à mes besoins.
OriginalL'auteur xavjuan | 2010-02-11
Vous devez vous connecter pour publier un commentaire.
Essayer de mettre
env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME']=1
dans votre SConstruct.Cette "magie vaudou' a fonctionné pour moi. Je suis surpris parce que je ne vois pas la différence dans la compilation des options de commande après l'ajout de la de la SConstruct. J'espère que le féticheur qui est venu avec cette magie nous l'explique le commun des mortels.
Le SharedLibrary générateur vérifie si tous les fichiers objets ont été construits avec les SharedObject constructeur (et donc avec -fPIC). env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME']=1 désactive cette case. Vous devez décider vous-même si c'est effectivement une bonne idée...
OriginalL'auteur Liang Wul
Ce problème n'est pas spécifique à scons. Pour construire une bibliothèque partagée, vous aurez besoin des objets qui sont compilés avec le code indépendant de la position (
-fPIC
). Votre meilleur pari est de faire de la bibliothèque partagée à partir des fichiers sources compilé avec les bonnes options.Dans SCons, vous pouvez définir une liste d'objectifs qui est utilisé pour construire à la fois libMine.un et libShared..
Mise à jour: pour votre deuxième question, la SharedLibrary constructeur pourrait faire ce que vous avez besoin de:
Si pas,
LINKFLAGS
définit les indicateurs transmis à un lien de commande.Je suis retourné et avait les fichiers dans le .un être compilé avec-fPIC, mais cela ne semble pas aider.
Le LINKFLAGS a été utile. thx.
OriginalL'auteur Dave Bacher
J'ai le même problème sous cygwin. J'ai passé '-fPIC " options de gcc lors de la construction des objets et a obtenu le message d'avertissement suivant:
Moi aussi j'ai passé de "partagés" à la commande de liaison. Et j'ai finalement obtenu l'erreur
Il semble scons ne permet pas de créer directement à partir obj ou fichiers lib, et on peut créer à partir d'une liste de fichiers sources (à l'aide de SharedLibrary()) ou un fichier source + 'LIBS' option comme dummytaurus dit. Je suis curieux à propos de ça.
OriginalL'auteur NovelX
Cela devrait fonctionner.
libMine.a
Oui, c'est fait. Le
SharedLibrary
builder utiliseProgramScanner
à la recherche pour les dépendances spécifiées viaLIBS
.OriginalL'auteur
Le problème est dans la fonction
SharedFlagChecker
(Default.py), qui vérifie que pour un interne "partagé" pavillon. Le SCons documentation mène à croire qu'il maintient la distinction entre les objets partagés et les objets statiques via le suffixe (SHOBJSUFFIX
), mais n'est pas. La solution est facile. Dans le fichierscons-local.../SCons/Default.py
trouver leSharedFlagChecker
et edit:Maintenant des objets fabriqués par les
SharedObject
constructeur pourront être couplés dans une bibliothèque partagée.OriginalL'auteur M. A. Moshier
La solution pour résoudre ce problème ont été utilisés un 'SharedObject' comme suit:
et:
Cordialement,
OriginalL'auteur L-Sebastien