2010-11-18 37 views
0

J'essaie de créer une bibliothèque partagée (en fait un module Python) qui se lie à une bibliothèque statique. Les deux bibliothèques font partie du même projet et sont construites en utilisant cmake.CMake: Bibliothèque partagée qui utilise la bibliothèque statique

Maintenant, la bibliothèque partagée est construit comme ceci:


add_library(MyLibPython SHARED ${PYTHON_WRAPPERS_SRC}) 
set_target_properties(MyLibPython PROPERTIES PREFIX "") 
target_link_libraries(MyLibPython MyLibStatic ${LIBS}) 

Cela construit sans erreur, mais lorsque je tente d'importer le module Python, je reçois:

 
ImportError: 
lib/python/MyLibPython.so: undefined symbol: _Zone_of_my_MyLibStatic_functions 

J'ai aussi un nombre d'exécutables (tests unitaires) qui sont construits de la même manière, et ils fonctionnent parfaitement.

Je devrais ajouter, cela utilise gcc sous Linux.

+0

Essayez-vous un lien vers Boost :: Python statique? Ou êtes-vous lié à la bibliothèque enveloppée statiquement? Si le premier: voir ma réponse ici: http://stackoverflow.com/questions/4120169/msvc-boostpython-static-linking-to-dll-pyd –

+0

C'est le dernier. Mais merci pour le lien, il était intéressant de lire que lier statiquement pour booster python ne fonctionne pas toujours aussi bien ... – Krumelur

Répondre

2

Vérifiez votre ligne de commande de l'éditeur de liens. Est-ce qu'il passe quelque chose comme -Wl,--as-needed? Si tel est le cas, il se peut que cela n'inclue pas tout ce qui est requis par la bibliothèque statique.

Je ne pense pas que votre technique soit portable en général. Pouvez-vous obtenir une bibliothèque partagée avec laquelle faire un lien? Je pense qu'il existe des plateformes où tout ce qui entre dans une bibliothèque partagée doit être compilé en tant que PIC.

Quoi qu'il en soit, pour relier une archive entière avec GNU ld (rechercher man ld):

gcc -o foo foo.o bar.o baz.o -Wl,--whole-archive libfoo.a -Wl,--no-whole-archive [rest-of-linker-args] 
+0

Je n'ai malheureusement pas de librairie de déchiquetage. Je pourrais probablement lier directement les fichiers objet, mais cela nécessite beaucoup de réécriture des scripts de construction, et j'espérais éviter cela. – Krumelur

+0

@Krumelur: Toujours, vérifiez votre ligne de commande de l'éditeur de liens. –

+0

Lier l'ensemble de l'archive fonctionne. Le problème semble être que lors de la liaison des fichiers .so, les bibliothèques statiques ne sont pas incluses même si le code dans la bibliothèque statique se réfère à lui. Il semble que ld suppose que l'exécutable (python dans ce cas) sera lié aux mêmes bibliothèques statiques que le .so. – Krumelur