2010-10-05 4 views
1

Je suis en train de construire une extension C++ pour python en utilisant swig. J'ai suivi les instructions ci-dessous et les autres à un T et n'arrive pas à charger mon extension.toutes les informations de compilation swig + python + mingw disponibles sont-elles périmées?

J'ai parcouru cet article sur le site MinGW sous "Comment créer des extensions Python?"

http://www.mingw.org/wiki/FAQ

Je trouve aussi ces tutoriels:

http://boodebr.org/main/python/build-windows-extensions http://www.mail-archive.com/[email protected]/msg04655.html http://oldwiki.mingw.org/index.php/Python%20extensions

I » m en utilisant Panda3d-1.7.0 pour compiler - panda sur win32 exécute python2.6.4 (MSC v.1500 compilé). J'utilise MinGW gcc/g ++ (GCC) 3.4.5 pour compiler.

J'ai remarqué que quand je lance setup.py avec la commande suivante:

python setup.py build -cmingw32 

gcc.exe fonctionne d'abord, puis g ++ exe pour construire le PYD.. Elle se lie et se connecte assez bien (pas d'erreurs) mais, quand je copie les fichiers _extension.pyd et extension.py dans Panda3d-1.7.0 \ python \ Lib \ site g ++ est lié à: -lpython26 -lmsvcr90

et exécuter -Les forfaits> python -c « extension à l'importation » de la ligne de commande, Python décharges suivantes:

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "C:\Panda3D-1.7.0\python\Lib\site-packages\extension.py", line 25, in <module> 
    _bullet = swig_import_helper() 
    File "C:\Panda3D-1.7.0\python\Lib\site-packages\extension.py", line 21, in swig_import_helper 
    _mod = imp.load_module('_extension', fp, pathname, description) 
ImportError: DLL load failed: The specified module could not be found. 

des conseils ou des pointeurs? Merci!

ct

Répondre

2

Deux choses à vérifier:

  • Vérifiez la DLL de bibliothèque d'exécution C lié à votre python et à votre DLL d'extension avec dependency walker pour vous assurer qu'ils utilisent le même CRT. C'est une source courante de problèmes lors de la construction d'extensions pour d'autres langues. (Je le vois souvent avec Lua, par exemple) et peut causer des bugs intéressants et intermittents qui sont particulièrement difficiles à localiser. IIRC, les versions Python "officielles" pour Windows sont passées à Visual Studio Express à partir de MinGW. Cela peut rendre presque impossible d'utiliser MinGW pour construire une extension C++ qui peut être appelée à partir d'un Python compilé et lié à Visual Studio en raison de différences irréconciliables dans l'ABI C++.

ces deux ajouter à des conseils pour vous assurer que l'ABI vous assumez dans votre extension DLL correspond à l'ABI assumée par l'application d'hébergement, et que vous n'êtes pas double emploi avec des blocs fonctionnels fondamentaux tels que le CRT Cela peut contenir ou gérer un état difficile à partager correctement entre les instances.

Edit: L'édition améliorée de la question parle fortement d'y être des problèmes avec discordances entre le C++ ABI de Microsoft et le GCC C++ ABI qui sont known to differ.

+0

Merci pour votre aide. Le walker de dépendances fait remarquer que certains de la lib *.les fichiers avec lesquels je suis lié manquent leurs dll respectives dans mon chemin Je vais jouer avec ça pendant un moment, quand il sera résolu, je reviendrai avec vous. –

+0

Juste vérifié tout dehors et il semble que c'était mon problème - gcc/g ++ liaient avec une lib * .a qui n'avait pas de compagnon dll dans mon% PATH% - merci encore pour le conseil et le href à la dépendance marcheur, sauvé ma journée! –

+0

@ct, Notez également que le dépendant des dépendances peut être scripté. Je l'ai inclus dans ma suite de tests normale avant de compiler une version ou un programme d'installation pour m'assurer que j'ai empaqueté toutes les DLL nécessaires, par exemple. C'est un outil pratique. Heureux d'avoir aidé. – RBerteig

Questions connexes