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 :

Compilation avec un programme en c


Sujet :

Linux

  1. #1
    Membre actif Avatar de JavaAcro
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2004
    Messages
    533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 100
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juin 2004
    Messages : 533
    Points : 294
    Points
    294
    Par défaut Compilation avec un programme en c
    Bonjour,
    J'ai un programme, tout simple, écrit en C:

    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
    #include <stdio.h>
    #include <math.h>
     
    main()
    {
    float N;
    do
    {
    printf("Entre un nombre(>=0): ");
    scanf("%f", &N);
    }
    while(N<0);
    printf("La racine carrée de %2f est %2f\n", N, sqrt(N));
    return 0;
    }
    La compilation et l'excution sous windows avec Dev-Cpp, marche bien mais sous la Suse 10.1, j'ai essayé de compiler ce programme (racine.c), avec gcc, en faisant:
    alors, j'ai obtenu le message d'erreur:
    /tmp/ccgWQYS.O: dans la fonction <<main>>
    racine.c: (.text+0xsd): réference indéfinie vers <<sqrt>>
    Collect2: ld returned 1 exit status
    Ma question est:
    Y a t-il un problème de gcc pour la version de SuSe 10.1?
    Merci pour l'aide.
    The beautiful thing about learning is that nobody can take it away from you.

  2. #2
    Membre habitué Avatar de keikoz
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 146
    Points : 173
    Points
    173
    Par défaut
    Bonjour

    ll faut ajouter une option de compilation particulière (-lm), nécessaire lorsqu'on utilise math.h, et qui permet d'inclure l'utilisation du coprocesseur arithmétique à l'exécutable (à ce que j'ai compris). Essaye comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -o racine racine.c -lm

    Au passage, ajoute aussi -Wall aux options de compilation, ce qui ajoute les warnings. Dans ton cas ça t'aurais indiqué que tu n'as pas précisé le type de valeur retourné par main(). Par ailleurs, tu devrais indiquer ce que main() attend comme argument:


  3. #3
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Une question qui n'a rien a voir, mais c'est normal qu'il y est un ; après l'instruction while?

    Merci

    ++
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  4. #4
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Oui tout à fait. ça équivaut à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while(condition)
    {
    }
    Donc une boucle sans opération. Par exemple pour plus avoir de '\n' sur l'entrée on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while('\n' != getchar());
    Mon wiki (on y parle Debian principalement) : http://www.tchetch.net/

  5. #5
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Mais en fait là c'est plutôt un do{ ... } while(condition);
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    do
    {
        ....
    } while (condition);

    D'abord le contenu de la boucle est executé, puis ensuite la condition est testée. Le while c'est juste le contraire.

    Sinon le main est faux :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    int main(int argc, char **argv)

    et scanf est déconseillé sauf pour les gourous. Va poster dans le forum C ... Tu verras !
    Mon wiki (on y parle Debian principalement) : http://www.tchetch.net/

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par keikoz
    ll faut ajouter une option de compilation particulière (-lm), nécessaire lorsqu'on utilise math.h, et qui permet d'inclure l'utilisation du coprocesseur arithmétique à l'exécutable (à ce que j'ai compris).
    ça permet simplement d'ajouter la bibliothèque libm.[so|a] qui contient les fonctions déclarées dans math.h. Cela à été fait car cette partie de la bibliothèque standard est volumineuse et pas indispensable.

  7. #7
    Membre actif Avatar de JavaAcro
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2004
    Messages
    533
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 100
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juin 2004
    Messages : 533
    Points : 294
    Points
    294
    Par défaut
    Il est connu que le C++ , contient le C ou d'une autre façon encore plus claire, le C est un sous-ensemble de C++, par conséquent,la compilation(sous Linux et en particulier sous la SuSe), du programme racine.c peut se faire avec g++(au lieu de gcc), ainsi:
    ça passe sans bruit.
    The beautiful thing about learning is that nobody can take it away from you.

  8. #8
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Citation Envoyé par cheikhbouchihda
    Il est connu que le C++ , contient le C ou d'une autre façon encore plus claire, le C est un sous-ensemble de C++, par conséquent,la compilation(sous Linux et en particulier sous la SuSe), du programme racine.c peut se faire avec g++(au lieu de gcc), ainsi:
    Voilà une affirmation totalement fausse. Le C est un langage. Le C++ est un autre. C'est comme dire que Visual Basic est un sous-ensemble de Perl !

    Simplement compile ce petit code parfaitement valide en C. Il est simplement faux en C++.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char **argv)
    {
        int *a;
     
        a=malloc(sizeof * a);
        free(a);
     
        return 0;
    }
    Citation Envoyé par g++
    malloc.c: In function 'int main(int, char**)':
    malloc.c:8: error: invalid conversion from 'void*' to 'int*'
    Mon wiki (on y parle Debian principalement) : http://www.tchetch.net/

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

Discussions similaires

  1. Compilation d'un programme avec QPSQL
    Par abir_rzg dans le forum Bases de données
    Réponses: 6
    Dernier message: 06/08/2009, 15h58
  2. Réponses: 3
    Dernier message: 26/12/2008, 08h57
  3. Compiler un petit programme avec plusieurs fichiers avec g++
    Par Ourcoulouncoulou dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 16/12/2008, 13h48
  4. Utiliser gprof sur un programme compilé avec Visual C++ 2005
    Par G3G3 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 31/01/2008, 22h50
  5. Réponses: 4
    Dernier message: 13/10/2007, 15h18

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