Pb de compilation gcc après compilation cython

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.

3 réponses

  1. Contributeur
    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).
    0
    1. 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.
      0
      1. Contributeur
        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
        0
      2. Contributeur
        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
        0
    2. 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 ?
      0
      1. 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.
        0
      2. 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 ?
        0
      3. Contributeur
        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
        0
      4. Contributeur
        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 :-)
        0