IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Problème d'include et de fichier non trouvé alors qu'il est bien présent


Sujet :

C

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut Problème d'include et de fichier non trouvé alors qu'il est bien présent
    Bonjour,

    (Je rappelle que je ne suis pas spécialiste de C)

    Dans un truc tout simple et tout bête, https://www.cairographics.org/FAQ/#minimal_C_program
    Getting Started
    What would a minimal C program look like using cairo?
    Create a file called hello.c containing
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include <cairo.h>
     
    int
    main (int argc, char *argv[])
    {
    je vous passe le reste, je fais un ridicule copier/coller du code dans un squelette créé par geany, je l'enregistre sous cairotest.c, je compile et ça se vautre comme quoi ça ne trouve pas le .h,

    Pas de panique, je fais un # locate cairo.h (oui, je suis sous Linux) qui me retourne /usr/include/cairo/cairo.h donc je modifie un poil le include : #include <cairo/cairo.h>, j'enregistre je compile, ok, mais quand je construis, patatras, il y a une avalanche d'erreurs undefined reference to nom_d-une_méthode_cairo

    Pas de panique, le locate m'ayant aussi donné /usr/include/gtk-2.0/gdk/gdkcairo.h, je rajoute un include pour cette ligne, avec " et " plutôt que < et >, et là c'est l'horreur car je gagne
    /usr/include/gtk-2.0/gdk/gdkcairo.h:27:26: fatal error: gdk/gdkcolor.h: Aucun fichier ou dossier de ce type
    alors que ce !§%$*@ de fichier est bien présent à côté de l'autre, je le vois de mes yeux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /usr/include/gtk-2.0/gdk# ls -c1 gdkc*
    gdkcairo.h
    gdkcolor.h
    et si je suis en colère c'est parce que le message d'erreur est le même si je rajoute le include qui va bien pour ce second fichier, #include "/usr/include/gtk-2.0/gdk/gdkcolor.h"

    Au final, je mets tout en dur, et c'est toujours pareil, le gdkcolor.h est introuvable...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "/usr/include/cairo/cairo.h"
    #include "/usr/include/gtk-2.0/gdk/gdkcairo.h"
    #include "/usr/include/gtk-2.0/gdk/gdkcolor.h"
    Moi y en a pas comprendre, là, donc au secours et merci d'avance, bonne journée et bonne St-Valentin,

  2. #2
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 380
    Points
    1 380
    Par défaut
    Bonjour,
    tu as évidemment suivi à la lettre ce qui est expliqué dans la section qui suit celle dont tu nous as donné le lien, à savoir : «What compilation flags are required to compile that code?» ?
    Parce que c'est lors de la compilation que tu donnes (via la commande pkg-config) à ton compilateur les chemins qui lui sont nécessaires pour trouver les includes et les bibliothèques …

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Yep !
    Citation Envoyé par WhiteCrow Voir le message
    Bonjour,
    tu as évidemment suivi à la lettre ce qui est expliqué dans la section qui suit...
    Hé bien non, car comme mon écran n'a que 1200 pixels de haut, ma vision s'est arrêtée au bas de la fenêtre gris-bleu contenant le code, accolade fermante incluse, et je me suis bêtement dit que je verrais le reste après.
    Je n'ai donc pas vu la ligne qui explique tout, et comme à ce jour je n'ai jamais eu besoin de ce pkg-config, j'en ignorais l'utilité...

    Merci à toi, tiens, cadeau généré par le binaire exécuté juste avant de te répondre :
    Nom : hello-from-cairo.png
Affichages : 506
Taille : 21,8 Ko

    Allez hop !, et encore merci !

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 735
    Points : 31 060
    Points
    31 060
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Jipété Voir le message
    alors que ce !§%$*@ de fichier est bien présent à côté de l'autre, je le vois de mes yeux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /usr/include/gtk-2.0/gdk# ls -c1 gdkc*
    gdkcairo.h
    gdkcolor.h
    Travaillerais-tu sous root (ce "#" qui est affiché dans ton prompt et que j'ai mis en rouge) ???
    Comme c'est pas bien !!!!

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Travaillerais-tu sous root (ce "#" qui est affiché dans ton prompt et que j'ai mis en rouge) ???
    Comme c'est pas bien !!!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cat .bashrc
    #    couleur      user host chemin
    PS1='\[\033[1;31m\]\u@\h:\w#\[\033[0m\] '
    Dans la nouvelle machine (pas encore en prod' mais ça se rapproche), j'ai mis un $, ça me rappellera le dcl de vms, , et dans celle en cours je viens de le remplacer par >, c'est bien aussi.

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 735
    Points : 31 060
    Points
    31 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Dans la nouvelle machine (pas encore en prod' mais ça se rapproche), j'ai mis un $, ça me rappellera le dcl de vms, , et dans celle en cours je viens de le remplacer par >, c'est bien aussi.
    Ouais enfin ce n'est pas le design du prompt qui est important, c'est le fait de bosser sous root. Là ce que tu as fait c'est juste cacher le "#" du prompt root (style le débutant en C qui cache l'étoile derrière un nom de type) mais ça reste root.

    En fait, ce qui est grave dans le fait de bosser sous root c'est
    • tu bypasses les droits => ton code fonctionne chez-toi mais peut-être que pour un userX il sera bloqué par tel accès interdit que tu n'auras pas vu
    • tu shuntes les protections de ton OS => tu peux le cramer en une instruction (et je te promets que l'erreur est facile). Un exemple (vécu): j'avais l'habitude sur ma machine de dev (c'était avant Linux, sur des machines style Sun) de supprimer le contenu de /tmp pour nettoyer (c'était avant que /tmp soit purgé au démarrage). Je tapais donc (sous root) cd /tmp; rm -rf * .* et ça fonctionnait nickel.
      Puis un jour j'ai voulu aller plus vite et j'ai tapé rm -rf /tmp/* /tmp/.*" et là la commande ne m'a pas rendu la main. J'ai commencé à réfléchir sur ce qui pouvait se passer durant une poigné de secondes (une éternité pour un processeur) et tout d'un coup j'ai compris que dans "/tmp/.*" il y a "/tmp/../" et là... . J'ai fait ctrl-C et plutôt que de tenter de réparer les dégâts j'ai tout réinstallé de zéro. Et pourtant je bossais pas sous root, je passais root juste le temps qu'il faut. Mais même comme ça l'erreur est arrivée alors quand on bosse sous root en permanence...

    Bosser sous root c'est peut-être la facilité mais c'est pas super compliqué d'apprendre à gérer les droits. Déjà à la base tout le système t'est accessible au-moins en lecture donc t'as pas d'inquiétude de ce côté. Reste juste tes propres fichiers perso. Ben là tu mets tes dossiers en 755 (rwxr-xr-x) et tes fichiers en 644 (rw-r--r--) plus éventuellement le "x" pour les fichiers exécutables et tu n'as aucun souci. Tout le monde peut lire tes infos et toi seul peut les modifier. Ensuite si tu veux renforcer ben tu supprimes les "r" qui te semblent de trop. Le droit "r" pour un répertoire permet de le lire (typiquement "ls"), le droit "w" permet de le modifier (rajouter des fichiers ou en supprimer) et le droit "x" permet de s'y déplacer (typiquement "cd"). Et pour un fichier le droit "r" permet de le lire, le droit "w" de modifier son contenu et "x" de l'exécuter (si cela le justifie). Ok si on veut accéder à xxx/yyy/zzz il faut d'abord accéder à xxx/yyy donc il faut penser aux droits de toute la branche mais hormis pour les projets ultra-secrets, un droit rwxr-xr-x sur les dossiers est parfait (on peut les lire et/ou les traverser). Juste le détail à se souvenir c'est que "rm" c'est une suppression de fichier donc une modification du dossier qui le contient donc ce sont les droits du dossier qui sont pris en compte (droit "w") et pas ceux du fichier (il peut être en 000, il sera quand-même effaçable). A partir de là tu peux tout gérer. Et pour les actions nécessitant le droit root (il n'y en a pas de masses) tu as toujours su/sudo.

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Bonjour,

    Citation Envoyé par Jipété Voir le message
    Allez hop !, et encore merci !
    Désolé mais avec moi, ça n'est jamais fini...

    Un truc tout bête qui vient d'ici, avec juste le début (adapté à mon arborescence) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <stdlib.h>
    #include <gtk-2.0/gtk/gtk.h>
    #include <gtk-2.0/gdk/gdk.h>
    et bien sûr,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > gcc -o sanstitre sanstitre.c 
    In file included from sanstitre.c:25:0:
    /usr/include/gtk-2.0/gtk/gtk.h:32:21: fatal error: gdk/gdk.h: Aucun fichier ou dossier de ce type
    compilation terminated.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ locate gdk.h
    /usr/include/gtk-2.0/gdk/gdk.h
    Alors j'ai essayé autrement, d'après toutes mes docs ça devrait être valable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <stdlib.h>
    #include "/usr/include/gtk-2.0/gtk/gtk.h"
    #include "/usr/include/gtk-2.0/gdk/gdk.h"
    Mais même résultat foireux...

    Un truc m'échappe et je ne vois pas lequel car il me semble que sur un coup pareil je n'ai pas besoin du pkg-config dont on a causé ou, en tout cas, il n'en est pas question dans le post que j'ai cité.
    Et si je le rajoute ça ne change strictement rien,

    Mais alors, comment faire ?

    EDIT : j'ai trouvé un post de 2019 qui avait un titre comme mon nouveau problème, alors j'ai tout bien lu et j'ai fait ça :
    cc -o $1 $(pkg-config gtk+-2.0 --cflags --libs cairo) $1.c et ça compile !

    (mais ça ne fonctionne pas comme dans le post... Juste une bête fenêtre blanche, )
    /EDIT

  8. #8
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 380
    Points
    1 380
    Par défaut
    gtk2 … il y a plus récent. Passe au moins en Gtk3. Sinon pense à utiliser au moins make pour la construction de tes projets … et n'oublie pas les pkg-config qui vont bien.

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Citation Envoyé par WhiteCrow Voir le message
    gtk2 … il y a plus récent. Passe au moins en Gtk3.
    C'est prévu pour la semaine prochaine ou la suivante, et en fait ça se fera tout seul car changement de machine...

    Citation Envoyé par WhiteCrow Voir le message
    Sinon pense à utiliser au moins make pour la construction de tes projets … et n'oublie pas les pkg-config qui vont bien.
    Un make pour une bricole d'une centaine de lignes dont je voulais juste voir le rendu en 5 minutes ? (et effectivement, si ça compile, ça foire à l'affichage, c'est sans doute lié au point précédent)
    Quant au pkg-config, promis, le jour où je veux récrire LibreOffice, mais si tu voyais les choses minimalistes que je fais en C et si peu souvent, franchement, le jeu n'en vaut pas la chandelle.

    EDIT : comme ça m'a quand même titillé les neurones, que la nouvelle machine démarre en une poignée de secondes, et que je suis curieux, je l'ai allumée et j'ai voulu tester ce prog mais ce n'est pas allé bien loin : flopée d'erreurs à la compil avec un tas de trucs undefined, classique.
    Sauf que dans cette machine je ne trouve pas les paquets de cairo ni ceux de gtk3 à part deux ou trois trucs ridicules.
    Impossible d'aller plus loin, c'est encore un brave mystère, ça... /EDIT

  10. #10
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 380
    Points
    1 380
    Par défaut
    gtk est tout un environnement … il y a le runtime qui est suffisant pour exécuter des programmes ; mais si tu es en mode dèv alors il te faut les packages de dèv (gtk3-dev ?) et idem pour les dépendances.
    Ensuite un makefile c'est hyper simple, y compris pour des minis projets.

    Code Makefile : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CC ?= gcc
    PKGCONFIG = $(shell which pkg-config)
    CFLAGS = $(shell $(PKGCONFIG) --cflags gtk+-3.0)
    LDLIBS = $(shell $(PKGCONFIG) --libs gtk+-3.0)
     
    PROG = test-prog
     
    all: ${PROG}
     
    clean:
    	rm -f *.o ${PROG}

    Est-ce que ça vaut le coup de s'en passer ?

  11. #11
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Citation Envoyé par WhiteCrow Voir le message
    gtk est tout un environnement … il y a le runtime qui est suffisant pour exécuter des programmes ; mais si tu es en mode dèv alors il te faut les packages de dèv (gtk3-dev ?) et idem pour les dépendances.
    Oui mais moi je vais péter les plombs !
    Dans l'ancienne machine j'ai plein plein plein de libgtk2-truc-et-machin et aussi libgtk2.0-encore-dautres, et j'en ai 4 d'installés, dont un -dev et tout se passe bien, mis à part les soucis de chemins pour compiler.

    Dans la nouvelle il n'y a quasiment rien. Et là, je parle de l'outil d'installation des paquets, un truc qui te montre ce qui est installé et ce qu'il peut installer. Ben pour gtk3, il ne peut quasiment rien : juste libgtk3.0-cil et libgtk3.0-cil-dev comme candidats à l'install et c'est tout !

    C'est à se flinguer, Debian, maintenant...

    Perds pas ton temps avec ça, va.
    Mais je te remercie pour le Makefile, je vais le tenter, avec un helloworld,

  12. #12
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 969
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 969
    Points : 15 434
    Points
    15 434
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Mais je te remercie pour le Makefile, je vais le tenter, avec un helloworld,
    Je l'ai tenté avec ce prog qui devait dessiner une diagonale, et je gagne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sanstitre.c: In function ‘create_surface’:
    sanstitre.c:55:3: error: ‘for’ loop initial declarations are only allowed in C99 mode
    sanstitre.c:55:3: note: use option -std=c99 or -std=gnu99 to compile your code
    make: *** [sanstitre] Erreur 1
    où est-ce que je mets cette option dans le Makefile ?

    Dans mon script je l'avais mis au bout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cc -o $1 $(pkg-config gtk+-2.0 --cflags --libs cairo) -std=c99 $1.c
    EDIT : ça va, j'ai trouvé : au bout de CFLAGS : CFLAGS = $(shell $(PKGCONFIG) --cflags gtk+-2.0) -std=c99. /EDIT

    Merci !

  13. #13
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 380
    Points
    1 380
    Par défaut
    déjà ce serait une bonne chose d'utiliser gcc tout court (une version à jour de préférence ou clang) ou de ne pas utiliser l'alias cc et de préférer utiliser l'alias c99 … afin de ne pas compiler en mode ANSI C aka C89.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/09/2017, 15h37
  2. [DBase 3] Problème de fichier non trouvé
    Par sevyc64 dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 25/04/2015, 17h24
  3. Fichier non trouvé alors qu'il existe
    Par laurentSc dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 19/11/2014, 15h27
  4. Réponses: 5
    Dernier message: 06/02/2011, 00h53
  5. Réponses: 18
    Dernier message: 06/11/2010, 18h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo