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

Linux Discussion :

[CentOS] problème de reconnaissance de la lib C standard


Sujet :

Linux

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 12
    Points
    12
    Par défaut [CentOS] problème de reconnaissance de la lib C standard
    Salut tout le monde.

    J'ai récement installer Centos et je suis débutante sur linux

    J'ai un problème de reconnaissance des bibliothèque C avec mon programme, sachant que j'utilise make comme compilateur.

    Voici mon code :

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #include <linux/module.h>
    #include <linux/kernel.h>
    # include <linux/sched.h>
    # include <linux/netlink.h>
    # include <net/sock.h>
    # include <net/net_namespace.h>
    # include <stdlib.h>
    #include <stdio.h>
    #include <sys/sendfile.h> 
    # define NETLINK_NITRO 17
     
    MODULE_LICENSE("GPL");
     
    static struct sock *nl_sk = NULL;
     
    static void nl_data_ready (struct sk_buff *skb)
    {
     
       struct nlmsghdr *nlh = NULL;
       if(skb == NULL) {
       printk("skb is NULL \n");
       return ;
       }
       nlh = (struct nlmsghdr *)skb->data;
       printk(KERN_INFO "%s: received netlink message payload: %s\n", __FUNCTION__,
                  (char *) NLMSG_DATA(nlh));
     
    }
     
    static void netlink_test()
    {
     
    nl_sk = netlink_kernel_create(&init_net,NETLINK_NITRO,0, nl_data_ready,NULL, THIS_MODULE);
     
    }
     
    static int __init my_module_init(void)
    {
    printk(KERN_INFO "Initializing Netlink Socket");
    netlink_test();
    return 0;
    }
     
    static void __exit my_module_exit(void)
    {
    ssize_t sendfile(int fichier , int sock_fd , off_t * offset, size_t count);
    {
     FILE* fichier = NULL;
     
        fichier = fopen("/home/ahlem/GPL.odt" , "r+");
     
        if (fichier != NULL)
               return 0 ;// On lit et on écrit dans le fichier
     
         fclose(fichier) ; //le fichier doit être fermé si l'ouverture a réussi ie si fichier != NULL
         return ;
    }
    }
     
    module_init(my_module_init);
    module_exit(my_module_exit);

    Et voilà les erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [root@Ahlem bin]# make
    make -C /lib/modules/2.6.32-220.7.1.el6.x86_64/build M=/home/ahlem/bin modules
    make[1]: entrant dans le répertoire « /usr/src/kernels/2.6.32-220.13.1.el6.centos.plus.x86_64 »
      CC [M]  /home/ahlem/bin/prgfile.o
    /home/ahlem/bin/prgfile.c:8:21: erreur: stdlib.h : Aucun fichier ou dossier de ce type
    /home/ahlem/bin/prgfile.c:9:19: erreur: stdio.h : Aucun fichier ou dossier de ce type
    /home/ahlem/bin/prgfile.c:10:27: erreur: sys/sendfile.h : Aucun fichier ou dossier de ce type
    /home/ahlem/bin/prgfile.c:32: attention : function declaration isn’t a prototype
    /home/ahlem/bin/prgfile.c: In function ‘my_module_exit’:
    /home/ahlem/bin/prgfile.c:49: erreur: ‘FILE’ undeclared (first use in this function)
    /home/ahlem/bin/prgfile.c:49: erreur: (Each undeclared identifier is reported only once
    /home/ahlem/bin/prgfile.c:49: erreur: for each function it appears in.)
    /home/ahlem/bin/prgfile.c:49: erreur: ‘fichier’ undeclared (first use in this function)
    /home/ahlem/bin/prgfile.c:51: erreur: implicit declaration of function ‘fopen’
    /home/ahlem/bin/prgfile.c:54: attention : ‘return’ with a value, in function returning void
    /home/ahlem/bin/prgfile.c:56: erreur: implicit declaration of function ‘fclose’
    make[2]: *** [/home/ahlem/bin/prgfile.o] Erreur 1
    make[1]: *** [_module_/home/ahlem/bin] Erreur 2
    make[1]: quittant le répertoire « /usr/src/kernels/2.6.32-220.13.1.el6.centos.plus.x86_64 »
    make: *** [all] Erreur 2
    Il n'arrive pas à trouver les bibliothèques malgré qu'ils sont déjà installer, je suis sur, car j'ai déjà les utilisé dans un autre programme et ça marche bien sans erreurs mais avec le compilateur gcc.

    Quelqu'un peut m'informer s'il vous plaît ? Merci d'avance.

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    Alors pour commencer, make ce n'est pas un compilateur mais un outil permettant d'automatiser les taches de compilation. Pour commencer, tu pourrais nous fournir le contenu du Makefile, ça pourrait toujours être utile.

    Il n'arrive pas à trouver les bibliothèques malgré qu'ils sont déjà installer, je suis sur, car j'ai déjà les utilisé dans un autre programme et ça marche bien sans erreurs mais avec le compilateur gcc.
    As-tu essayé de compiler ce fichier en particulier via GCC seulement ? Si c'est pas le cas, essayes. As-tu installé un package du type : glibc ou libc-6.i386 etc ?

    Cordialement,
    Idriss

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 12
    Points
    12
    Par défaut
    voici mon Makefile : ( sachant que j'ai dejà l'utilser avec un autre programme et ça marche bien)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    obj-m += prgfile.o
    KVERSION = $(shell uname -r)
    all:
    	make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
    clean:
    	make -C /lib/modules/$(KVERSION)/build M=$(PWD) clea

    oui, j'essaye avec GCC mais il m'a fourni plus des erreurs que le make. ( remarque: c'est un programme de noyau donc c'est presque un module que je doit l'installer alors ils m'ont informer d'utilser le make que j'ai dejà l'utiliser dans autre programme qui ne diffère qu'un peu de ça et il a été bien executé)
    oui, j'ai installé un package de type libstdc++-devel.i686 car j'utilise Centos6.
    merci

  4. #4
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    La libstdc++ à priori c'est pour le C++, pas le même package que pour la libc (glibc sur CentOS je crois, à vérifier) ... ce n'est pas le bon package. Les erreurs fournie par gcc, il serait bon de nous les fournir.

    Cordialement,
    Idriss

  5. #5
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 12
    Points
    12
    Par défaut
    j'installe le glibc mais ils ont resté les memes erreurs .
    le but de mon programme est d'envoyer un ficheir de l'espace utilisateur vers le noyau. le programme de l'utilisateur a été bien compilé et executé avec gcc. alors que celui de noyau ne va plus.
    voilà le programme qui j'ai déjà executé avec le make et qui consiste d'ouvrir la socket et de recevoir un message de l'utilsateur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/kernel.h>
    # include <linux/sched.h>
    # include <linux/netlink.h>
    # include <net/sock.h>
    # include <net/net_namespace.h>
    # define NETLINK_NITRO 17
     
    MODULE_LICENSE("GPL");
     
    static struct sock *nl_sk = NULL;
     
    static void nl_data_ready (struct sk_buff *skb)
    {
     
       struct nlmsghdr *nlh = NULL;
       if(skb == NULL) {
       printk("skb is NULL \n");
       return ;
       }
       nlh = (struct nlmsghdr *)skb->data;
       printk(KERN_INFO "%s: received netlink message payload: %s\n", __FUNCTION__,
                  (char *) NLMSG_DATA(nlh));
     
    }
     
    static void netlink_test()
    {
     
    nl_sk = netlink_kernel_create(&init_net,NETLINK_NITRO,0, nl_data_ready,NULL, THIS_MODULE);
     
    }
     
    static int __init my_module_init(void)
    {
    printk(KERN_INFO "Initializing Netlink Socket");
    netlink_test();
    return 0;
    }
     
    static void __exit my_module_exit(void)
    {
    printk(KERN_INFO "Goodbye");
    sock_release(nl_sk->sk_socket);
    }
     
    module_init(my_module_init);
    module_exit(my_module_exit);
    on n'a pas une garnde différence. je juste l'ajoute la partie du réception et de lecture de fichier ainsi que les trois bibliothèques nécessaires ( <stdlib.h> <stdio.h <sys/sendfile.h> )
    j'espère que t'a bien compris mon problème !!

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Points : 426
    Points
    426
    Par défaut
    Bonjour,

    Si vos .h ne sont effectivement pas dans /usr/include, il faut que vous installiez les packages de "dev" qui contiennent les fichiers d'en-tête (sur Debian, ils sont suffixés par -dev, sur RHEL ou CentOS, il me semble qu'il y a dev dans le nom mais je ne me rappelle pas exactement...)

  7. #7
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 25
    Points : 12
    Points
    12
    Par défaut
    bonsoir :
    mes .h sont tous dans "include". voilà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [root@Ahlem ahlem]# find / -name "stdlib.h"
    /usr/src/linux-2.6.32/arch/powerpc/boot/stdlib.h
    /usr/include/bits/stdlib.h
    /usr/include/c++/4.4.4/tr1/stdlib.h
    /usr/include/stdlib.h
    [root@Ahlem ahlem]# find / -name "stdio.h"
    /usr/src/linux-2.6.32/arch/powerpc/boot/stdio.h
    /usr/include/bits/stdio.h
    /usr/include/c++/4.4.4/tr1/stdio.h
    /usr/include/stdio.h
    [root@Ahlem ahlem]# find / -name "sendfile.h"
    /usr/include/sys/sendfile.h
    je ne comprend pas vraiment où l'erreur exactement dont il ne trouve pas ces bibliothèques

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Points : 426
    Points
    426
    Par défaut
    En y réfléchissant, vous êtes en programmation kernel (ce que je ne pratique pas). Une petite recherche m'a donné ça : http://tldp.org/LDP/lkmpg/2.6/html/x1352.html

    Vous ne pouvez pas utiliser la library standard, donc pas de stdio

    Vous pouvez par contre utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include <linux/string.h>
    Mais pour écrire dans un fichier, il va falloir chercher...

Discussions similaires

  1. [XINE, CENTOS] problème pour les DVD + xine-lib introuvable
    Par MrVic dans le forum Applications et environnements graphiques
    Réponses: 0
    Dernier message: 11/05/2011, 20h40
  2. Réponses: 7
    Dernier message: 05/07/2006, 17h14
  3. Apache2 sur CentOS: Problème d'acces utilisateur
    Par Faith's Fall dans le forum Apache
    Réponses: 11
    Dernier message: 03/06/2006, 22h13
  4. Problème de reconnaissance javascript vbscript
    Par mouste79 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/05/2006, 19h12
  5. [FLASH MX2004] Problème de reconnaissance des caractères
    Par Spikefreeman dans le forum Flash
    Réponses: 10
    Dernier message: 04/01/2005, 23h08

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