2010-12-12 84 views
11

J'essaye de compiler python le code source foo.py en C en utilisant cython.Compilation de Python en C en utilisant Cython

En foo.py:

print "Hello World" 

La commande est en cours d'exécution Je cython foo.py.

Le problème est que lors de la compilation foo.c en utilisant gcc, je reçois l'erreur:

undefined reference to 'main'.

Répondre

19

lors de la conversion du code de python en c (en utilisant Cython), il le convertit en un code qui peut être compilé dans un objet partagé. Afin de le rendre exécutable, vous devez ajouter "--embed" à la commande de conversion cython. ce flag ajoute la fonction 'main' dont vous avez besoin, vous pouvez donc compiler le code c en fichier exécutable. notez que vous aurez besoin des bibliothèques d'exécution python .so pour exécuter l'exec.

11

Lisez la documentation Cython. Cela vous apprendra aussi (espérons-le) ce qu'est Cython et ce qu'il n'est pas. Cython est pour créer des extensions python (pas un compilateur Python-à-C généraliste), qui sont des objets partagés/dll. Les bibliothèques chargées dynamiquement n'ont pas une fonction main comme les programmes autonomes, mais les compilateurs supposent qu'ils lient finalement un exécutable. Vous devez leur dire autrement via flags (-shared methinks, mais encore une fois, référez-vous à la documentation de Cython) - ou mieux encore, ne vous compilez pas, utilisez un setup.py pour cela (encore une fois, lisez la documentation Cython).

+0

+1 pour l'explication – user225312

+2

pour moi cette réponse a abouti à la compilation d'une extension de travail. réponse de RoeeK résolu le problème de liaison, mais après Python n'a pas réussi à importer avec erreur 'ImportError: module dynamique ne définit pas la fonction init'. je vous remercie vraiment beaucoup, je pense qu'il serait plus agréable de l'écrire avec moins de style de conférence sans supposer la stupidité comme le suggère le 3 rtfm. – deeenes

0

La méthode habituelle consiste à utiliser distutils pour compiler le fichier généré par Cython. Cela vous donne également tous les répertoires d'inclusion dont vous avez besoin d'une manière portable.