Soucis de compilation ?

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

Le problème exposé dans ce sujet a été résolu.

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.

+0 -0

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 :)

+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.

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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