Soucis de compilation ?

/usr/bin/ld: error: k2k:1: unknown directive: gpchC013=

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonsoir,

suite à une modification / optimisation d’un code qui fonctionnait, la premi_re commande gcc échoue :

+---< oliv@droopy >---< ~/Coding/BBB/Check >
+---> zcc -o k2k *       
/usr/bin/ld: error: k2k:1: unknown directive: gpchC013=
>>> gpchC013=�#�����RVy�w=�:+__DBL_MIN_EXP__ (-1021)
                                                                __FLT_MIN__ 1.17549435e-38F&
>>> ^
collect2: ld returned 1 exit status
+---< oliv@droopy >---< ~/Coding/BBB/Check >
+---> zcc -o k2k * 
+---< oliv@droopy >---< ~/Coding/BBB/Check >

La seconde réussi.

Voici les arguments passés à gcc :

gcc -Wall -Wextra -pedantic -std=c89 -fno-common -fno-builtin

A savoir, que si j’opte pour : gcc -Wall -Wextra -pedantic -std=c99 -fno-common -fno-builtin Je ne rencontre pas d’erreurs.

  1. Je suis content de coder à la norme c99 !
  2. Je vous entends dire… Tu as le droit de compiler en std c99 :)

Néanmoins, je ne souhaite pas mourir bête quelqu’un saurait m’expliquer ?

la partion de code ci-dessous que l’on trouve ici

void
digitalWrite(char *gpioId, char *gp_name, int action)
{
    int devfd = -1;
    char *dev;
    char devn[32];

    struct gpio_pin_op op;

    /* mount & open the device dev : /dev/gpiox */
    dev = gpioId;
    if (strncmp(_PATH_DEV, dev, sizeof(_PATH_DEV) - 1))
    {
        (void)snprintf(devn, sizeof(devn), "%s%s", _PATH_DEV, dev);
        dev = devn;
    }
    if ((devfd = open(dev, O_RDWR)) == -1)
        err(1, "%s", dev);

    /* Write the action */
    if (action < 0 || action > 2)
        errx(1, "%d: invalid action", action);
    
    memset(&op, 0, sizeof(op));

a été remplacé par ceci :

void
digitalWrite(char *gpioId, char *gp_name, int action) {
        int devfd = -1;
        struct gpio_pin_op op;

        /* mount & open the device dev : /dev/gpiox */
        openGpioDevice(gpioId, &devfd);

        /* Write the action */
        if (action < 0 || action > 2)
                errx(1, "%d: invalid action", action);
        memset(&op, 0, sizeof(op));

        if (gp_name != NULL)
                strlcpy(op.gp_name, gp_name, sizeof(op.gp_name));
        op.gp_value = (action == 0 ? GPIO_PIN_LOW : GPIO_PIN_HIGH);

        if (action < 2) {
                ioctl(devfd, GPIOPINWRITE, &op);
        } else {
                ioctl(devfd, GPIOPINTOGGLE, &op);
        }

        /* To close file descriptor fd */
        close(devfd);

}

fonction:

int
openGpioDevice(char *gpioId, int *pdevfd) {
        char *dev;
        char devn[32];
        dev = gpioId;

        if (strncmp(_PATH_DEV, dev, sizeof(_PATH_DEV) - 1)) {
                (void)snprintf(devn, sizeof(devn), "%s%s", _PATH_DEV, dev);
                dev = devn;
        }
        *pdevfd = open(dev, O_RDWR);

        return 0;
}

Merci.

Édité par Taurre

+0 -0

Cette réponse a aidé l’auteur du sujet

Humm …

Je suppose que quand tu fais : zcc -o k2k *. Tu passes ainsi le fichier k2k comme si c’était un code source. Or ça ne peut pas marcher. gcc doit essayer de lier ça à la fin, je sais pas trop, comme si c’était un fichier objet quoi.

Puisque ça échoue, gcc supprime k2k (ou au moins le vide, je ne sais pas). Et donc la deuxième fois, ça marche.

Normalement si tu fais : rm k2k; zcc -o k2k *, ça devrait marché à tous les coups :)

Édité par ache

ache.one                 🦹         👾                                🦊

+0 -0
Auteur du sujet

Effectivement :) Si je fais rm k2k ; zcc -o k2k * OK

Si je fais zcc -o k2k *.c OK aussi…

bref comme le cours le disait… :)

Du coup je me pose d’autres questions mais ce sera pour plus tard…

Merci beaucoup, bonne soirée.

+0 -0
Astuce

Quand l’erreur est donnée pas ld comme c’est le cas ici. Le problème est un problème d’édition des liens (Voir phases de la compilation). Ce qui signifie en gros que la compilation est passée, le problème vient alors du fait que le linker (ld) ne sait pas trop quoi faire de ce qu’on lui donne (une fonction dont il n’arrive pas à trouver la définition, une autre dont il a plusieurs définitions différentes, ou encore comme ici un symbole qu’il ne comprend pas).

Merci, de même, bonne soirée.

Édité par ache

ache.one                 🦹         👾                                🦊

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte