Comment puis-je construire mon C extensions avec MinGW-w64 en Python?
J'ai donc un peu de Python, C extensions j'ai déjà construit et utilisé en 32 bits Python exécute dans Win7. J'ai toutefois passé à 64 bits Python, et je vais avoir des problèmes de construction de l'extension de do avec MinGW-w64.
J'ai fait les modifications distutils comme par ce post, mais j'obtiens des erreurs bizarres suggérant que quelque chose est faux:
$ python setup.py build
running build
running build_ext
building 'MyLib' extension
c:\MinGW64\bin\x86_64-w64-mingw32-gcc.exe -mdll -O -Wall -Ic:\Python27\lib\site-packages\numpy\core\include -Ic:\Python27\include -Ic:\Python27\PC -c MyLib.c -o build\temp.win-amd64-2.7\Release\mylib.o
MyLib.c: In function 'initMyLib':
MyLib.c:631:5: warning: implicit declaration of function 'Py_InitModule4_64' [-Wimplicit-function-declaration]
writing build\temp.win-amd64-2.7\Release\MyLib.def
c:\MinGW64\bin\x86_64-w64-mingw32-gcc.exe -shared -s build\temp.win-amd64-2.7\Release\mylib.o build\temp.win-amd64-2.7\Release\MyLib.def -Lc:\Python27\libs -Lc:\Python27\PCbuild\amd64 -lpython27 -o build\lib.win-amd64-2.7\MyLib.pyd
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x13d): undefined reference to `__imp_PyExc_ValueError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1275): undefined reference to `__imp_PyExc_ValueError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1eef): undefined reference to `__imp_PyExc_ImportError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1f38): undefined reference to `__imp_PyExc_AttributeError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1f4d): undefined reference to `__imp_PyCObject_Type'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1f61): undefined reference to `__imp_PyExc_RuntimeError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1fc7): undefined reference to `__imp_PyExc_RuntimeError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x1ffe): undefined reference to `__imp_PyExc_RuntimeError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x2042): undefined reference to `__imp_PyExc_RuntimeError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x206c): undefined reference to `__imp_PyExc_RuntimeError'
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x208a): more undefined references to `__imp_PyExc_RuntimeError' follow
build\temp.win-amd64-2.7\Release\mylib.o:MyLib.c:(.text+0x20a7): undefined reference to `__imp_PyExc_ImportError'
collect2.exe: error: ld returned 1 exit status
error: command 'x86_64-w64-mingw32-gcc' failed with exit status 1
J'ai googlé autour un peu pour trouver des informations, mais il n'est pas facile de trouver une réponse définitive. Quelqu'un pourrait-il éclairer sur ce point? Quelles modifications dois-je faire pour être en mesure de réussir à construire C les extensions 64 bits Python dans Win7?
EDIT:
Après quelques renseignements utiles dans cgohlke les commentaires ci-dessous, j'ai réussi à générer libpython27.a
. Cependant suivant les conseils sur ce post (2ème à la dernière) j'ai toujours eu la __imp_Py_InitModule4_64
erreur. Après quelques graves Google-fu, j'ai réussi à trébucher sur ce post de me dire de le renommer la Py_InitModule4
ligne Py_InitModule4_64
. Après que tout a fonctionné à merveille.
- Vous devez créer
libpython27.a
avecgendef.exe python27.dll
etdlltool.exe --dllname python27.dll --def python27.def --output-lib libpython27.a
et le placer dansC:\Python27\libs
- J'ai vu quelques posts mentionnant gendef. Mais il n'est pas facile de trouver des informations sur la façon d'aller sur la génération de la libpython27.un fichier. Auriez-vous par hasard pour connaître de tout?
- Ah ok, gendef et dlltool sont deux commandes différentes. Vais essayer. Merci.
- Ok, il a compilé tous droit, mais lorsque j'essaie d'importer le module-je obtenir
Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: DLL load failed: The specified procedure could not be found.
je pense que quelque part je doit manquer un fichier. La seule chose que j'ai fait avec le gendef des trucs a mettrelibpython27.a
dansC:\Python27\libs
. Ai-je raté quelque chose? - Je suis donc passé par toutes les étapes que par ceci post (2e à partir de la bas). Mais maintenant, il ne compile pas, et je reçois ce
build\temp.win-amd64-2.7\Release\cquant.o:cQuant.c:(.text+0x1f09): undefined reference to
__imp_Py_InitModule4_64' collect2.exe: erreur: ld a retourné 1 code de sortie` - Hmm donc, il y a quelque chose qui peut être fait à ce sujet, ou vais-je avoir à admettre la défaite?
- J'ai essayé le
-DMS_WIN64
drapeau trop, mais j'ai toujours l'erreur. Je ne comprends vraiment pas pourquoi il devrait être si difficile à compiler en 64 bits Python lors de la 32 bits est très simple et direct. Merci pour l'aide, beaucoup apprécié. - J'ai enfin réussi à faire le tri. J'ai juste eu à renommer le
Py_InitModule4
lignePy_InitModule4_64
dans lepython27.def
fichier. Merci beaucoup pour l'aide. Si vous arrive d'être la cgohlke derrière ce site, merci pour celui-là aussi, ces binaires ont été un énorme aider de temps en temps 🙂 - Pourquoi êtes-vous ensemble sur mingw-w64? pouvez-vous utiliser les visual c++ 2008 express sp1 kit de développement logiciel windows 7 pour .net frameworks 3.5 sp1 et l'utilisation
setenv /release /x64
,set DISTUTILS_USE_SDK=1
,set MSSdk=1
etpip install blah
ou la méthode d'installation de votre choix. - Je ne me rappelle pas les détails exacts, mais il y avait quelque chose avec mon code que
Visual C++ 2008
n'aimais pas (C99 lié je pense). Normalement, je voudrais juste changer le code, mais le même code est utilisé sur une machine Linux ainsi. Donc, c'est une longue histoire courte, je mis la mingw-w64 de l'environnement jusqu'à la place pour que je puisse avoir la même base de code tout au long de.
Vous devez vous connecter pour publier un commentaire.
Cela a fonctionné pour moi avec Python 3.3 :
créer statique python lib de dll
python dll est généralement dans C:/Windows/System32; dans msys shell:
utilisation rasade de générer des wrappers
par exemple,
swig -c++ -python myExtension.i
wrapper DOIT être compilé avec MS_WIN64, ou votre ordinateur se bloquer lorsque vous importez la classe en Python
bibliothèque partagée
assurez-vous que tous shared libs (gdal, OtherSharedLibs) sont dans votre CHEMIN
(windows n'utilise pas LD_LIBRARY_PATH ou PYTHONPATH)
en Python, juste: l'importation myExtension
voila!
Voici un exemple de code pour VC++ Construire des Outils
https://github.com/starnight/python-c-extension/tree/master/00-HelloWorld
Vous pourriez essayer:
Cependant, ce n'est pas un travail pour moi.
Ma Solution est la suivante:
installer Anaconda 64bit python 3.6
installer mingw64
de la compilation de la dll à partir de c fichier par
chargement de fichier dll .py script