Menu

Pb de compilation gcc après compilation cython

Messages postés
46
Date d'inscription
samedi 15 juillet 2017
Dernière intervention
5 octobre 2018
- - Dernière réponse : [Dal]
Messages postés
4810
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
14 décembre 2018
- 9 oct. 2018 à 14:22
Bonjour à tous,

Je suis débutant en programmation et j'ai un problème avec gcc pour la compilation d'un fichier .c
Seulement le fichier a été obtenu par compilation en C d'un script Python avec Cython. Quand j'essaie de recompiler le fichier ainsi obtenu pour en faire un exécutable, voici ce que j'obtiens :



Merci d'avance pour vos réponses.
Afficher la suite 

Votre réponse

3 réponses

Messages postés
4810
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
14 décembre 2018
0
Merci
Bonjour Prot0.8,

Tout d'abord, je n'ai jamais utilisé Cython et j'utilise Linux Debian. Certainement, si tu ne reçois pas de réponses, les autres membres du forum qui fréquentent le forum C de CCM n'utilisent pas Cython et/ou Windows non plus, et tu aurais de meilleures chances en posant ta question dans un forum dédié à cet outil.

Il est probable que ton installation de Cython et de ses prérequis de fonctionnement ne soit pas complète. Comme tu as l'air d'être sous Windows, as tu suivi ces instructions :

http://docs.cython.org/en/latest/src/quickstart/install.html
http://docs.cython.org/en/latest/src/tutorial/appendix.html
https://github.com/cython/cython/wiki/InstallingOnWindows
https://github.com/cython/cython/wiki/CythonExtensionsOnWindows

La documentation a l'air un peu spartiate et assez confuse, les auteurs de la doc en sont conscients :

Any contributions towards making the Windows install process smoother is welcomed; it is an unfortunate fact that none of the regular Cython developers have convenient access to Windows.

Sur la nature de ton message d'erreur, le préprocesseur de gcc arrête la compilation car
#include "Python.h"
(avec des guillemets) signifie que le fichier Python.h doit se trouver dans le répertoire de compilation, et qu'il ne dois pas y être. Si la bibliothèque de programmation C d'où vient cet entête est correctement installée et accessible à un emplacement connu du compîlateur, le code source devrait faire un
#include <Python.h>
(avec des chevrons), et le compilateur irait chercher le fichier d'entête à son emplacement d'installation.

Si tu ne trouves pas par toi même en corrigeant ton installation, il serait bien que tu nous fournisses les infos suivantes :

1. un copier coller complet de la ligne de commande gcc qui génère cette erreur et du message d'erreur complet.
2. le contenu de tes variables d'environnement en lançant la commande
set

3. le résultat de
gcc -E -Wp,-v -
(fait Ctrl-C pour sortir de cette commande).
4. tu cherches sur ton disque si un fichier "Python.h" est bien présent, et dis nous où.
5. tu cherches sur ton disque si un fichier du genre "libpython*.a" est bien présent, et dis nous où (avec un nombre à la place de l'étoile représentant la version installée).

Avec ces informations, on pourra peut-être diagnostiquer plus précisément ce qu'il y a à faire.

Dal

N.B. : évite les captures d'écran, stp, fais un copier-coller du contenu du terminal, et poste le avec la balise code du forum (le bouton à droite du bouton de soulignement).
Commenter la réponse de [Dal]
Messages postés
46
Date d'inscription
samedi 15 juillet 2017
Dernière intervention
5 octobre 2018
0
Merci
Bonjour et merci pour votre réponse,

J'essaie de suivre toute les directives mais après l'installation d'anaconda je suis un peu perdu donc je préfère vous donner les informations demandées :

1.
C:\Users\NoName>cd Documents\Scripts

C:\Users\NoName\Documents\Scripts>gcc main.c -o programme
gcc: error: main.c: No such file or directory
gcc: fatal error: no input files
compilation terminated.


2.
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\NoName\AppData\Roaming
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
COMPUTERNAME=NONAME
ComSpec=C:\Windows\system32\cmd.exe
DriverData=C:\Windows\System32\Drivers\DriverData
HOMEDRIVE=C:
HOMEPATH=\Users\NoName
LOCALAPPDATA=C:\Users\NoName\AppData\Local
LOGONSERVER=\\NONAME
NUMBER_OF_PROCESSORS=4
OneDrive=C:\Users\NoName\OneDrive
OS=Windows_NT
Path=C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\dotnet\;C:\MinGW\bin;;C:\Program Files\Microsoft VS Code\bin;C:\Users\NoName\AppData\Local\Programs\Python\Python37-32\Scripts\;C:\Users\NoName\AppData\Local\Programs\Python\Python37-32\;C:\Users\NoName\AppData\Local\Microsoft\WindowsApps;C:\Users\NoName\.dotnet\tools
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 142 Stepping 9, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=8e09
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PROMPT=$P$G
PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules
PUBLIC=C:\Users\Public
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\Windows
TEMP=C:\Users\NoName\AppData\Local\Temp
TMP=C:\Users\NoName\AppData\Local\Temp
USERDOMAIN=NONAME
USERDOMAIN_ROAMINGPROFILE=NONAME
USERNAME=NoName
USERPROFILE=C:\Users\NoName
windir=C:\Windows


3.
ignoring nonexistent directory "c:\mingw\bin\../lib/gcc/mingw32/6.3.0/../../../../mingw32/include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/6.3.0/include"
ignoring duplicate directory "/mingw/lib/gcc/mingw32/6.3.0/../../../../include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/6.3.0/include-fixed"
ignoring nonexistent directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/6.3.0/../../../../mingw32/include"
ignoring duplicate directory "/mingw/include"
#include "..." search starts here:
#include <...> search starts here:
c:\mingw\bin\../lib/gcc/mingw32/6.3.0/include
c:\mingw\bin\../lib/gcc/mingw32/6.3.0/../../../../include
c:\mingw\bin\../lib/gcc/mingw32/6.3.0/include-fixed
End of search list.


4. Il y a effectivement un fichier "Python.h" à l'emplacement :

C:\Users\NoName\AppData\Local\Programs\Python\Python37-32\include

5. Et Il y a bien un fichier libpython37.a :

C:\Users\NoName\AppData\Local\Programs\Python\Python37-32\libs

Me conseilleriez vous de passer sur Debian ? J'avais prévu de le faire car à ce que j'ai compris il est plus aisé de programmer (du moins en python) sur des distributions linux comme Debian non ?
Je voulais de toute manière m'essayer à Linux donc je n'ai rien à perdre.
[Dal]
Messages postés
4810
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
14 décembre 2018
-
Re :-)

j'ai compris il est plus aisé de programmer (du moins en python) sur des distributions linux comme Debian non ?

Il est plus facile de créer ton environnement de programmation (en Python, mais aussi généralement pour d'autres langages, en particulier le C), car les outils sont installés ou accessibles facilement et l'installation des dépendances et bibliothèques de programmation est géré par les gestionnaires de paquets pour la bonne architecture de ton système.

1.

C:\Users\NoName>cd Documents\Scripts

C:\Users\NoName\Documents\Scripts>gcc main.c -o programme
gcc: error: main.c: No such file or directory
gcc: fatal error: no input files
compilation terminated.

Tu ne t'es pas déplacé dans un répertoire contenant un fichier main.c, cette erreur est différente de celle qui est visible sur ta capture (gcc ne trouve pas main.c dans le répertoire courant). En ligne de commande sous Windows, lance la commande
dir
pour vérifier au préalable le contenu du répertoire courant avant d'essayer de lancer quelque chose dessus.

Sinon, avec les autres indications fournies, on apprend que tu as une machine 64 bits, que tu as dû installer MingW sous C:\MinGW, qu'à l'exception de PATH tu n'as pas de variables d'environnement particulières pour gcc, que Python semble installé sur C:\Users\NoName\AppData\Local\Programs\Python\Python37-32\ et que tu disposes bien d'un fichier d'entête "Python.h" sous un répertoire "include" de l'emplacement d'installation et d'un binaire "libpython37.a" compilé pour gcc sous un répertoire "libs" de l'emplacement d'installation.

Comme tu es en 64 bits, si tu as téléchargé une version 64 bits de MinGW, il te faut aussi une version 64 bits du binaire "libpython37.a" compilé pour gcc (ou une version 32 bits des deux que ton système puisse exécuter).

Alors, sous réserve que ces suppositions soient exactes, que tu soies en ligne de commande dans le bon répertoire contenant un fichier main.c, et qu'il n'y ait pas d'autres sources à compiler que main.c pour produire ton exécutable, tu pourrais :

- modifier main.c pour que la ligne
#include "Python.h"
devienne
#include <Python.h>
...
- lancer ta compilation avec les options de gcc indiquant l'emplacement de l'entête (option
-I
) et de la lib (option
-L
), et indiquant à l'éditeur de liaison comment la lib s'appelle (option
-l
avec le nom libpython37.a sans "lib" et sans ".a"). Au total, cela donnerai quelque chose comme cela :

gcc -IC:\Users\NoName\AppData\Local\Programs\Python\Python37-32\include -LC:\Users\NoName\AppData\Local\Programs\Python\Python37-32\libs main.c -o programme.exe -lpython37

(non testé)

Dal
[Dal]
Messages postés
4810
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
14 décembre 2018
-
si cela fonctionne, tu pourras ensuite créer des variables d'environnement pour gcc sur ton système Windows pour y mettre ces chemins respectivement dans C_INCLUDE_PATH et LIBRARY_PATH pour simplifier ta ligne de commande, qui pourra se réduire à :

gcc main.c -o programme.exe -lpython37

https://gcc.gnu.org/onlinedocs/gcc/Environment-Variables.html
Commenter la réponse de Prot0.8
Messages postés
46
Date d'inscription
samedi 15 juillet 2017
Dernière intervention
5 octobre 2018
0
Merci
De ce qui est de la commande erroné dans l'invite de commande je me suis effectivement trompé au moment de la saisie.
Après j'ai modifié la ligne de commande
#include "Python.h"
en
#include <Python.h>
et lancer la compilation avec la commande conseillé et j'obtiens cela :

C:\Users\NoName\Documents\Scriptes>gcc -IC:\Users\NoName\AppData\Local\Programs\Python\Python37-32\include -LC:\Users\NoName\AppData\Local\Programs\Python\Python37-32\libs main.c -o programme.exe -lpython37
In file included from C:\Users\NoName\AppData\Local\Programs\Python\Python37-32\include/Python.h:68:0,
from main.c:4:
C:\Users\NoName\AppData\Local\Programs\Python\Python37-32\include/pytime.h:123:59: warning: 'struct timeval' declared inside parameter list will not be visible outside of this definition or declaration
PyAPI_FUNC(int) _PyTime_FromTimeval(_PyTime_t *tp, struct timeval *tv);
^~~~~~~
C:\Users\NoName\AppData\Local\Programs\Python\Python37-32\include/pytime.h:130:12: warning: 'struct timeval' declared inside parameter list will not be visible outside of this definition or declaration
struct timeval *tv,
^~~~~~~
C:\Users\NoName\AppData\Local\Programs\Python\Python37-32\include/pytime.h:135:12: warning: 'struct timeval' declared inside parameter list will not be visible outside of this definition or declaration
struct timeval *tv,
^~~~~~~
c:/mingw/bin/../lib/gcc/mingw32/6.3.0/../../../libmingw32.a(main.o):(.text.startup+0xa0): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status


Pourtant si j'ai bien compris le problème peut venir du fait que les deux logiciels ne soient pas tous en 32bits et après vérification il me semble que les deux sont bien en version 32bits ?

Pensez-vous qu'en passant sur Debian j'aurais plus de simplicité à tout configurer (puisque je repartirais de 0) en demandant de l'aide sur un forum dédié à cet OS ?
D'après le message d'erreur, il faut que tu définisses une fonction main() dans ton script python, comme en c.

Pensez-vous qu'en passant sur Debian j'aurais plus de simplicité à tout configurer (puisque je repartirais de 0) en demandant de l'aide sur un forum dédié à cet OS ?

Quel est l'objectif à terme ?
Veux-tu distribuer ton programme sur diverses plateformes tout en « cachant » les sources ?
Car autant sur windows, je conçois qu'il est plus simple (pour l'utilisateur) de fournir un exécutable, mais sur linux, il suffit d'indiquer quelles sont les bibliothèques/paquets nécessaires à installer pour se servir de ton programme.
Non je ne souhaite pas cacher les sources mais comme j'ai cru comprendre sur un autre forum, il était plus simple de configurer une machine sur Linux.
Dans un premier temps j'utiliserais les programmes uniquement pour moi et quand je progresserais je les distriburaient mais en open source pour que des utilisateurs plus expérimentés puissent améliorer mon script.
Tout ce que je veux réussir à faire c'est créer des exécutables de programmes en Python pour que les utilisateurs Windows puissent les utilisés sans avoir à installer un interpréteur Python en plus du programme.

Est-ce qu'il faut que j'ajoute la commande main() en début de script ?
[Dal]
Messages postés
4810
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
14 décembre 2018
-
ta compilation a l'air en bon chemin :-)

je suppose que tu utiilses Python 3, et que le problème que tu signales ressemble à celui traité là : https://stackoverflow.com/questions/24219012/building-standalone-application-with-cython-mingw

apparemment tu as plusieurs solutions proposées par les intervenants de ce fil sur SO :

- une solution est de modifier le main.c en trouvant ces lignes qui doivent être quelque part dans le code de main.c produit :

#if PY_MAJOR_VERSION < 3
int main(int argc, char** argv) {
#elif defined(WIN32) || defined(MS_WINDOWS)
int wmain(int argc, wchar_t **argv) {
#else

et de remplacer dans la ligne correspondant à la ligne 4 ci-dessus
int wmain(int argc, wchar_t **argv) {
par
int main(int argc, char** argv) {
... c'est un peu brutal, mais pourquoi pas, si ton programme ne se sert pas d'options passées en ligne de commande :-)

- une autre solution serait d'utiliser Python 2 au lieu de 3 avec Cython

- une autre solution serait de ne pas faire ce changements dans le code source et de rester en Python 3, mais d'intégrer une option additionnelle
-municode
à la ligne de compilation gcc, pour que le gcc de MinGW utilise le point d'entrée wmain (conçu pour traiter des wide chars). Si ta version de MingW est récente, elle peut supporter cette option, et cela peut fonctionner en changeant ta ligne de commande gcc de cette façon :

gcc -municode -IC:\Users\NoName\AppData\Local\Programs\Python\Python37-32\include -LC:\Users\NoName\AppData\Local\Programs\Python\Python37-32\libs main.c -o programme.exe -lpython37


Une autre solution selon cet autre fil https://openclassrooms.com/forum/sujet/cython-probleme-de-commande serait de modifier la commande Cython lorsque tu appelles cython.py en y mettant
--embed=WinMain
apparemment au lieu de
--embed
...

Tu n'aurais pas ce genre de problèmes sous Linux, la signature
wmain
étant non standard en C et étant particulière à la façon dont Windows gère Unicode.

A toi de voir si tu veux passer sous Linux. Cela demande un peu d'investissement pour apprendre à se servir d'un nouveau système d'exploitation. Cependant si ton but est de distribuer à tes amis des programmes qu'ils puissent exécuter facilement, l'exécutable produit ne fonctionnera que sous Linux, et tu risques de manquer ton but premier à moins que tous tes amis ne soient déjà sous Linux :-)

Dal
[Dal]
Messages postés
4810
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
14 décembre 2018
-
si tu es parvenu à compiler et à produire ton exécutable, tu pourrais passer ce fil en "Résolu" en cliquant sur la roue dentée en haut de ta question d'origine :-)
Commenter la réponse de Prot0.8