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éfinition multiple sur une lib externe


Sujet :

C

  1. #1
    Membre expérimenté Avatar de RPGamer
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Mars 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués

    Informations forums :
    Inscription : Mars 2010
    Messages : 168
    Par défaut Problème définition multiple sur une lib externe
    Salut,

    Je réalise le programme pour un petit robot équipé d'une carte RoBoard. La carte RoBoard peut être programmée avec la librairie RoBoIO rendant théoriquement les accès aux GPIO, port I2C, COM, SPI, etc. très faciles. C'est la première fois que je fais ça.

    J'ai pris la version déjà compilée pour Linux depuis le site officiel du fabricant : http://www.roboard.com/download_ml.htm

    Je développe avec Code::Blocks. J'ai donc ajouté les chemins Include/ et Lib/ dans Settings->Compiler...->Search directories et j'ai ajouté le fichier .a dans les options du projet via Project->Build options...->Linker settings.

    Si je crée un programme en commençant avec un #include <roboard.h> comme indiqué dans les exemples, tout semble compiler correctement. Mon problème survient si plusieurs programmes incluent eux-mêmes roboard.h et que je les inclus dans un autre programme. Par exemple :

    io.h
    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
    #ifndef __IO_H
    #define __IO_H
     
    #include <stdbool.h>
     
    /* Nombre maximum de pins sur la RoBoard */
    #define MAX_PINS    32
     
    void io_register_pin(int pin);
    void io_unregister_pin(int pin);
    bool io_pin_is_registered(int pin);
    void io_set_rb_version(void);
    void io_init_lib(void);
    void io_destroy(void);
     
    #endif // __IO_H
    io.c
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #include "io.h"
    #include "servo.h"
    #include <stdio.h>
    #include <roboard.h>
     
    /* Tableau pour l'enregistrement des pins utilisees */
    static bool pins[MAX_PINS];
     
    void io_init_lib(void) {
     
        int i;
        long use_pin = 0;
        Servo *servos[MAX_PINS];
        int nb_servos = 0;
     
        // initialisation de la version de la RoBoard
        roboio_SetRBVer(RB_110);
     
        // recuperation des servos enregistres
        servo_get_elements(servos, &nb_servos);
     
        // si au moins 1 servo a ete enregistre
        if (nb_servos > 0) {
     
            for (i = 0; i < nb_servos; i++) {
     
                // on ajoute les pin utilisees pour les servos
                use_pin += servos[i]->use_pin;
     
            }
     
        }
     
        else {
     
            // pour les GPIO des capteurs on n'associe aucune pin
            use_pin = RCSERVO_USENOPIN;
     
        }
     
        // initialisation de la lib
        if (!rcservo_Init(use_pin)) {
     
            fprintf(stderr, "Impossible d'initialiser la RC Servo lib (%s).", roboio_GetErrMsg());
     
        }
     
    }
     
    void io_register_pin(int pin) {
     
        pins[pin] = true;
     
    }
     
    void io_unregister_pin(int pin) {
     
        pins[pin] = false;
     
    }
     
    bool io_pin_is_registered(int pin) {
     
        return pins[pin];
     
    }
     
    void io_destroy(void) {
     
        rcservo_Close();
     
    }
    gpio.h
    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
    #ifndef __GPIO_H
    #define __GPIO_H
     
    /* Etats possibles pour un GPIO. */
    typedef enum {
        LOW,
        HIGH
    } GPIO_STATE;
     
    /* Structure d'un GPIO. */
    typedef struct {
        char *name;
        int pin;
        GPIO_STATE state;
    } GPIO;
     
    void gpio(GPIO *gpio, char *name, int pin);
    void gpio_enable(GPIO *gpio);
    void gpio_disable(GPIO *gpio);
    void gpio_switch(GPIO *gpio);
    void gpio_get_elements(GPIO **gpio_elements, int *number);
    void gpio_destroy(GPIO *gpio);
     
    #endif // __GPIO_H
    gpio.c
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    #include "gpio.h"
    #include "io.h"
    #include <stdio.h>
    #include <string.h>
    #include <roboard.h>
     
    /* Tableau pour l'enregistrement des GPIO */
    static GPIO *gpios[MAX_PINS];
    static int nb_gpios = 0;
     
    void gpio(GPIO *gpio, char *name, int pin) {
     
        // on verifie si la pin nest pas deja utilisee
        if (io_pin_is_registered(pin)) {
     
            fprintf(stderr, "La pin RCSERVO_PINS%d est deja utilisee.\n", pin);
            return;
     
        }
     
        // initialisatiion et enregistrement de la structure du GPIO
        strcpy(gpio->name, name);
        gpio->pin = pin;
        gpio->state = LOW;
        gpios[nb_gpios++] = gpio;
     
        // enregistrement de la pin
        io_register_pin(pin);
     
    }
     
    void gpio_enable(GPIO *gpio) {
     
        rcservo_OutPin(gpio->pin, HIGH);
        gpio->state = HIGH;
     
    }
     
    void gpio_disable(GPIO *gpio) {
     
        rcservo_OutPin(gpio->pin, LOW);
        gpio->state = LOW;
     
    }
     
    void gpio_switch(GPIO *gpio) {
     
        rcservo_OutPin(gpio->pin, gpio->state == LOW ? HIGH : LOW);
     
    }
     
    void gpio_get_elements(GPIO **gpio_elements, int *number) {
     
        gpio_elements = gpios;
        *number = nb_gpios;
     
    }
     
    void gpio_destroy(GPIO *gpio) {
     
        int i;
        for (i = 0; i < nb_gpios; i++) {
     
            if (gpios[i]->pin == gpio->pin) {
     
                gpios[i] = NULL;
                io_unregister_pin(gpio->pin);
                break;
     
            }
     
        }
     
    }
    main.c
    Code : 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>
     
    #include "io/gpio.h"
     
    int main()
    {
     
           // utilisation des GPIO
     
           return EXIT_SUCCESS;
    }
    Si je tente de compiler, j'ai une série d'erreurs de type multiple definition of '' sur chaque fonction de la librairie.

    Pourtant le code du fichier roboard.h dans le répertoire Include/ est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef __ROBOARD_H
    #define __ROBOARD_H
     
    #include "common.h"
    #include "io.h"
    #include "rcservo.h"
    #include "spi.h"
    #include "ad79x8.h"
    #include "i2c.h"
    #include "com.h"
     
    #endif
    Il me semble que les directives préprocesseur devraient empêcher toute inclusion multiple en cas d'utilisation de plusieurs programmes faisant appels à des fonctions de cette librairie.

    Merci d'avance pour toute aide ou explication

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Pourrait-on avoir le contenu de la console de CB lors du build ?

    J'ai donc ajouté les chemins Include/ et Lib/ dans Settings->Compiler...->Search directories et j'ai ajouté le fichier .a dans les options du projet via Project->Build options...->Linker settings
    Tu aurais sans doute dû passé uniquement par les options du projet. Les include path et library path sont dans ton cas dépendant du projet. Pas bien grave.
    Pourrais-tu nous faire un screenshot des linker settings du projet également ?

    A priori, ce n'est pas un problème de garde d'inclusion sauf si du code est défini dans les fichiers h, ce qui normalement donne lieu à 20 coups de fouet en place publique.

  3. #3
    Membre expérimenté Avatar de RPGamer
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Mars 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués

    Informations forums :
    Inscription : Mars 2010
    Messages : 168
    Par défaut
    Pourrait-on avoir le contenu de la console de CB lors du build ?
    Certainement

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    -------------- Clean: Debug in small-robot (compiler: GNU GCC Compiler)---------------
     
    Cleaned "small-robot - Debug"
     
    -------------- Build: Debug in small-robot (compiler: GNU GCC Compiler)---------------
     
    gcc -Wall  -g -m32    -I/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/beacon.c -o obj/Debug/beacon.o
    gcc -Wall  -g -m32    -I/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/io/gpio.c -o obj/Debug/io/gpio.o
    gcc -Wall  -g -m32    -I/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/io/io.c -o obj/Debug/io/io.o
    gcc -Wall  -g -m32    -I/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/io/sensor.c -o obj/Debug/io/sensor.o
    gcc -Wall  -g -m32    -I/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/io/servo.c -o obj/Debug/io/servo.o
    gcc -Wall  -g -m32    -I/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/io/tmcl.c -o obj/Debug/io/tmcl.o
    gcc -Wall  -g -m32    -I/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/jobs/fire_conquest.c -o obj/Debug/jobs/fire_conquest.o
    /home/cyril/Documents/RBT/crh-2014/src/small-robot/jobs/fire_conquest.c:18:13: warning: ‘fq_init’ defined but not used [-Wunused-function]
     static void fq_init(void) {
                 ^
    gcc -Wall  -g -m32    -I/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/jobs/fresco.c -o obj/Debug/jobs/fresco.o
    gcc -Wall  -g -m32    -I/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/jobs/shooting_mammoths.c -o obj/Debug/jobs/shooting_mammoths.o
    gcc -Wall  -g -m32    -I/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/main.c -o obj/Debug/main.o
    gcc -Wall  -g -m32    -I/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/motion/avoid.c -o obj/Debug/motion/avoid.o
    gcc -Wall  -g -m32    -I/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/move.c -o obj/Debug/move.o
    /home/cyril/Documents/RBT/crh-2014/src/small-robot/move.c:363:19: warning: ‘move_update_from_tmcl’ defined but not used [-Wunused-function]
     static MOVE_ERROR move_update_from_tmcl(void)
                       ^
    gcc -Wall  -g -m32    -I/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/strategies/strategy1.c -o obj/Debug/strategies/strategy1.o
    gcc -Wall  -g -m32    -I/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/vector.c -o obj/Debug/vector.o
    g++ -L/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Lib  -o bin/Debug/small-robot obj/Debug/beacon.o obj/Debug/io/gpio.o obj/Debug/io/io.o obj/Debug/io/sensor.o obj/Debug/io/servo.o obj/Debug/io/tmcl.o obj/Debug/jobs/fire_conquest.o obj/Debug/jobs/fresco.o obj/Debug/jobs/shooting_mammoths.o obj/Debug/main.o obj/Debug/motion/avoid.o obj/Debug/move.o obj/Debug/strategies/strategy1.o obj/Debug/vector.o   -lpthread  ../RoBoIO/Lib/libRBIO.a 
    obj/Debug/io/io.o: In function `rcservo_MoveToMix':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/rcservo.h:366: multiple definition of `rcservo_MoveToMix'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/rcservo.h:366: first defined here
    obj/Debug/io/io.o: In function `rcservo_SendPWMPulses':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/rcservo.h:370: multiple definition of `rcservo_SendPWMPulses'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/rcservo.h:370: first defined here
    obj/Debug/io/io.o: In function `rcservo_IsPWMCompleted':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/rcservo.h:373: multiple definition of `rcservo_IsPWMCompleted'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/rcservo.h:373: first defined here
    obj/Debug/io/io.o: In function `rcservo_Outp':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/rcservo.h:376: multiple definition of `rcservo_Outp'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/rcservo.h:376: first defined here
    obj/Debug/io/io.o: In function `rcservo_Inp':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/rcservo.h:379: multiple definition of `rcservo_Inp'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/rcservo.h:379: first defined here
    obj/Debug/io/io.o: In function `rcservo_Outps':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/rcservo.h:382: multiple definition of `rcservo_Outps'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/rcservo.h:382: first defined here
    obj/Debug/io/io.o: In function `rcservo_Inps':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/rcservo.h:385: multiple definition of `rcservo_Inps'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/rcservo.h:385: first defined here
    obj/Debug/io/io.o: In function `spi_Init':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/spi.h:136: multiple definition of `spi_Init'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/spi.h:136: first defined here
    obj/Debug/io/io.o: In function `spi_Initialize':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/spi.h:142: multiple definition of `spi_Initialize'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/spi.h:142: first defined here
    obj/Debug/io/io.o: In function `spi_InitializeSW':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/spi.h:145: multiple definition of `spi_InitializeSW'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/spi.h:145: first defined here
    obj/Debug/io/io.o: In function `adc_InUse':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:355: multiple definition of `adc_InUse'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:355: first defined here
    obj/Debug/io/io.o: In function `adc_Init':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:358: multiple definition of `adc_Init'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:358: first defined here
    obj/Debug/io/io.o: In function `adc_Close':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:361: multiple definition of `adc_Close'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:361: first defined here
    obj/Debug/io/io.o: In function `adc_ChangeChannel':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:364: multiple definition of `adc_ChangeChannel'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:364: first defined here
    obj/Debug/io/io.o: In function `adc_InitMCH':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:367: multiple definition of `adc_InitMCH'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:367: first defined here
    obj/Debug/io/io.o: In function `adc_CloseMCH':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:370: multiple definition of `adc_CloseMCH'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:370: first defined here
    obj/Debug/io/io.o: In function `adc_ChangeChannels':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:373: multiple definition of `adc_ChangeChannels'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:373: first defined here
    obj/Debug/io/io.o: In function `adc_ReadCH':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:376: multiple definition of `adc_ReadCH'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:376: first defined here
    obj/Debug/io/io.o: In function `ad7908_Initialize':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:382: multiple definition of `ad7908_Initialize'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:382: first defined here
    obj/Debug/io/io.o: In function `ad7908_InitializeMCH':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:385: multiple definition of `ad7908_InitializeMCH'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:385: first defined here
    obj/Debug/io/io.o: In function `ad7918_Initialize':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:388: multiple definition of `ad7918_Initialize'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:388: first defined here
    obj/Debug/io/io.o: In function `ad7918_InitializeMCH':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:391: multiple definition of `ad7918_InitializeMCH'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:391: first defined here
    obj/Debug/io/io.o: In function `ad7928_Initialize':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:394: multiple definition of `ad7928_Initialize'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:394: first defined here
    obj/Debug/io/io.o: In function `ad7928_InitializeMCH':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:397: multiple definition of `ad7928_InitializeMCH'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:397: first defined here
    obj/Debug/io/io.o: In function `adc_Initialize':
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:400: multiple definition of `adc_Initialize'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/ad79x8.h:400: first defined here
    Process terminated with status 1 (0 minutes, 10 seconds)
    50 errors, 2 warnings (0 minutes, 10 seconds)
    Pour les options linker du projet :



    C'est vrai pour les options du compilateur, du coup j'ai mis les chemins dans les options du projet uniquement.

    Merci pour la réponse

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    /home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/rcservo.h:366: multiple definition of `rcservo_MoveToMix'
    obj/Debug/io/gpio.o:/home/cyril/Documents/RBT/crh-2014/src/RoBoIO/Include/rcservo.h:366: first defined here
    Tu pourrais nous montrer le contenu de ce fichier aux alentours de la ligne 366 ?

  5. #5
    Membre expérimenté Avatar de RPGamer
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Mars 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués

    Informations forums :
    Inscription : Mars 2010
    Messages : 168
    Par défaut
    J'ai ça :
    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
    #if !defined(ROBOIO_DLL) || defined(__RCSERVO_LIB)
        // for compatibility to RoBoIO 1.61
        RB_INLINE RBAPI(void) rcservo_MoveToMix(unsigned long* width, unsigned long playtime, long* mixwidth) {
            rcservo_SetAction(width, playtime);
            while (rcservo_PlayActionMix(mixwidth) != RCSERVO_PLAYEND);
        }
        RB_INLINE RBAPI(bool) rcservo_SendPWMPulses(int channel, unsigned long period, unsigned long duty, unsigned long count) {
            return rcservo_SendPWM(channel, period, duty, count);
        }
        RB_INLINE RBAPI(bool) rcservo_IsPWMCompleted(int channel) {
            if (rcservo_CheckPWM(channel) == 0L) return true; else return false;
        }
        RB_INLINE RBAPI(void) rcservo_Outp(int channel, int value) {
            rcservo_OutPin(channel, value);
        }
        RB_INLINE RBAPI(int) rcservo_Inp(int channel) {
            return rcservo_InPin(channel);
        }
        RB_INLINE RBAPI(void) rcservo_Outps(unsigned long channels, unsigned long value) {
            rcservo_OutPort(channels, value);
        }
        RB_INLINE RBAPI(unsigned long) rcservo_Inps(unsigned long channels) {
            return rcservo_InPort(channels);
        }
    #endif
    La ligne 366 concerne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        RB_INLINE RBAPI(void) rcservo_MoveToMix(unsigned long* width, unsigned long playtime, long* mixwidth) {
    J'ai vérifié les directives #endif pour voir si il en manque mais ça m'aurait étonné de toute façon.

    Le fichier commence par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #ifndef __RCSERVO_H
    #define __RCSERVO_H
    et fini par :
    de façon régulière pour que ce genre de cas n'apparaissent pas il me semble.

    Le code complet au cas ou :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    #ifndef __RCSERVO_H
    #define __RCSERVO_H
     
    #include "defines.h"
     
     
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    RBAPI(bool) rcservo_InUse(void);
     
    RBAPI(bool) rcservo_Init(unsigned long usedchannels);
    //-- values for the "usedchannels" argument (note that different values can be added to use multiple channels)
         #define RCSERVO_USENOPIN                (0L)
         #define RCSERVO_USEPINS1                (1L)
         #define RCSERVO_USEPINS2                (1L<<1)
         #define RCSERVO_USEPINS3                (1L<<2)
         #define RCSERVO_USEPINS4                (1L<<3)
         #define RCSERVO_USEPINS5                (1L<<4)
         #define RCSERVO_USEPINS6                (1L<<5)
         #define RCSERVO_USEPINS7                (1L<<6)
         #define RCSERVO_USEPINS8                (1L<<7)
         #define RCSERVO_USEPINS9                (1L<<8)
         #define RCSERVO_USEPINS10               (1L<<9)
         #define RCSERVO_USEPINS11               (1L<<10)
         #define RCSERVO_USEPINS12               (1L<<11)
         #define RCSERVO_USEPINS13               (1L<<12)
         #define RCSERVO_USEPINS14               (1L<<13)
         #define RCSERVO_USEPINS15               (1L<<14)
         #define RCSERVO_USEPINS16               (1L<<15)
         #define RCSERVO_USEPINS17               (1L<<16)  // only for RoBoard RB-100/RB-100b1/RB-100b2
         #define RCSERVO_USEPINS18               (1L<<17)  // only for RoBoard RB-100/RB-100b1/RB-100b2
         #define RCSERVO_USEPINS19               (1L<<18)  // only for RoBoard RB-100/RB-100b1/RB-100b2
         #define RCSERVO_USEPINS20               (1L<<19)  // only for RoBoard RB-100/RB-100b1/RB-100b2
         #define RCSERVO_USEPINS21               (1L<<20)  // only for RoBoard RB-100/RB-100b1/RB-100b2
         #define RCSERVO_USEPINS22               (1L<<21)  // only for RoBoard RB-100/RB-100b1/RB-100b2
         #define RCSERVO_USEPINS23               (1L<<22)  // only for RoBoard RB-100/RB-100b1/RB-100b2
         #define RCSERVO_USEPINS24               (1L<<23)  // only for RoBoard RB-100/RB-100b1/RB-100b2
         #define RCSERVO_USEPINS25               (1L<<24)  // only for RoBoard RB-100b1
         #define RCSERVO_USEPINS26               (1L<<25)  // only for RoBoard RB-100b1
         #define RCSERVO_USEPINS27               (1L<<26)  // only for RoBoard RB-100b1
         #define RCSERVO_USEPINS28               (1L<<27)  // only for RoBoard RB-100b1
         #define RCSERVO_USEPINS29               (1L<<28)  // only for RoBoard RB-100b1
         #define RCSERVO_USEPINS30               (1L<<29)  // only for RoBoard RB-100b1
         #define RCSERVO_USEPINS31               (1L<<30)  // only for RoBoard RB-100b1
         #define RCSERVO_USEPINS32               (1L<<31)  // only for RoBoard RB-100b1
    //-- if the above function returns false, roboio_GetErrCode() may return:
    //   #define ERROR_RBVER_UNKNOWN             (ERR_NOERROR + 801) //need include <common.h>
    //   #define ERROR_RBVER_UNMATCH             (ERR_NOERROR + 800) //need include <common.h>
    //   #define ERROR_IOINITFAIL                (ERR_NOERROR + 100) //need include <io.h>
    //   #define ERROR_IOSECTIONFULL             (ERR_NOERROR + 101) //need include <io.h>
    //   #define ERROR_CPUUNSUPPORTED            (ERR_NOERROR + 102) //need include <io.h>
    //   #define ERROR_PWM_INUSE                 (ERR_NOERROR + 300) //need include <pwm.h>
         #define ERROR_RCSERVO_INUSE             (ERR_NOERROR + 400)
         #define ERROR_RCSERVO_PWMINUSE          (ERR_NOERROR + 401)
     
    RBAPI(void) rcservo_Close(void);
     
     
    RBAPI(bool) rcservo_SetServo(int channel, unsigned servono);
    //-- values for the "channel" argument
         #define RCSERVO_PINS1                   (0)
         #define RCSERVO_PINS2                   (1)
         #define RCSERVO_PINS3                   (2)
         #define RCSERVO_PINS4                   (3)
         #define RCSERVO_PINS5                   (4)
         #define RCSERVO_PINS6                   (5)
         #define RCSERVO_PINS7                   (6)
         #define RCSERVO_PINS8                   (7)
         #define RCSERVO_PINS9                   (8)
         #define RCSERVO_PINS10                  (9)
         #define RCSERVO_PINS11                  (10)
         #define RCSERVO_PINS12                  (11)
         #define RCSERVO_PINS13                  (12)
         #define RCSERVO_PINS14                  (13)
         #define RCSERVO_PINS15                  (14)
         #define RCSERVO_PINS16                  (15)
         #define RCSERVO_PINS17                  (16)  // only for RoBoard RB-100/RB-100b1/RB-100b2
         #define RCSERVO_PINS18                  (17)  // only for RoBoard RB-100/RB-100b1/RB-100b2
         #define RCSERVO_PINS19                  (18)  // only for RoBoard RB-100/RB-100b1/RB-100b2
         #define RCSERVO_PINS20                  (19)  // only for RoBoard RB-100/RB-100b1/RB-100b2
         #define RCSERVO_PINS21                  (20)  // only for RoBoard RB-100/RB-100b1/RB-100b2
         #define RCSERVO_PINS22                  (21)  // only for RoBoard RB-100/RB-100b1/RB-100b2
         #define RCSERVO_PINS23                  (22)  // only for RoBoard RB-100/RB-100b1/RB-100b2
         #define RCSERVO_PINS24                  (23)  // only for RoBoard RB-100/RB-100b1/RB-100b2
         #define RCSERVO_PINS25                  (24)  // only for RoBoard RB-100b1
         #define RCSERVO_PINS26                  (25)  // only for RoBoard RB-100b1
         #define RCSERVO_PINS27                  (26)  // only for RoBoard RB-100b1
         #define RCSERVO_PINS28                  (27)  // only for RoBoard RB-100b1
         #define RCSERVO_PINS29                  (28)  // only for RoBoard RB-100b1
         #define RCSERVO_PINS30                  (29)  // only for RoBoard RB-100b1
         #define RCSERVO_PINS31                  (30)  // only for RoBoard RB-100b1
         #define RCSERVO_PINS32                  (31)  // only for RoBoard RB-100b1
    RBAPI(bool) rcservo_SetServos(unsigned long channels, unsigned servono);
    //-- values for the "channels" argument (note that different values can be added to use multiple channels)
    //   #define RCSERVO_USEPINS1                (1L)
    //   #define RCSERVO_USEPINS2                (1L<<1)
    //   ...... (refer to the "usedchannels" argument of rcservo_Init())
    //-- values for the "servono" argument
         #define RCSERVO_SERVO_DEFAULT           (0x00)  //conservative setting for most servos with pulse feedback
         #define RCSERVO_SERVO_DEFAULT_NOFB      (0x01)  //conservative setting for most servos without pulse feedback
         #define RCSERVO_KONDO_KRS786            (0x11)
         #define RCSERVO_KONDO_KRS788            (0x12)
         #define RCSERVO_KONDO_KRS78X            (0x13)
         #define RCSERVO_KONDO_KRS4014           (0x14)  //not directly work on RB-100/RB-110 due to the unmatched PWM pull-up/-down resistors
         #define RCSERVO_KONDO_KRS4024           (0x15)
    //   #define RCSERVO_KONDO_KRS4034           (0x16)  //not directly work on RB-100/RB-100RD/RB-110/RB-050 due to the unmatched PWM pull-up/-down resistors
         #define RCSERVO_HITEC_HSR8498           (0x22)
         #define RCSERVO_FUTABA_S3003            (0x31)
         #define RCSERVO_SHAYYE_SYS214050        (0x41)
         #define RCSERVO_TOWERPRO_MG995          (0x51)
         #define RCSERVO_TOWERPRO_MG996          (0x52)
         #define RCSERVO_DMP_RS0263              (0x61)
         #define RCSERVO_DMP_RS1270              (0x62)
         #define RCSERVO_GWS_S777                (0x71)
         #define RCSERVO_GWS_S03T                (0x72)
         #define RCSERVO_GWS_MICRO               (0x73)
    //-- if the above two functions return false, roboio_GetErrCode() may return:
    //   #define ERROR_RCSERVO_INUSE             (ERR_NOERROR + 400)
         #define ERROR_RCSERVO_UNKNOWNSERVO      (ERR_NOERROR + 461)
         #define ERROR_RCSERVO_WRONGCHANNEL      (ERR_NOERROR + 462)
     
    RBAPI(bool) rcservo_SetServoType(int channel, unsigned svtype, unsigned fbmethod);
    //-- values for the "channel" argument
    //   #define RCSERVO_PINS1                   (0)
    //   #define RCSERVO_PINS2                   (1)
    //   ...... (refer to the "channel" argument of rcservo_SetServo())
    //-- values for the "type" argument
         #define RCSERVO_SV_FEEDBACK             (1)     //servo with pulse feedback
         #define RCSERVO_SV_NOFEEDBACK           (2)     //servo without pulse feedback
    //-- values for the "fbmethod" argument (note that different values can be added to use multiple settings)
         #define RCSERVO_FB_SAFEMODE             (0)
         #define RCSERVO_FB_FASTMODE             (1)     //much faster than safe mode but could cause servo's shake
         #define RCSERVO_FB_DENOISE              (1<<1)  //use denoise filter; more accurate but very slow
    //-- if the above function returns false, roboio_GetErrCode() may return:
    //   #define ERROR_RCSERVO_WRONGCHANNEL      (ERR_NOERROR + 462)
     
    RBAPI(bool) rcservo_SetServoParams1(int channel, unsigned long period, unsigned long minduty, unsigned long maxduty);
    RBAPI(bool) rcservo_SetServoParams2(int channel, unsigned long invalidduty, unsigned long minlowphase);
    //-- values for the "channel" argument
    //   #define RCSERVO_PINS1                   (0)
    //   #define RCSERVO_PINS2                   (1)
    //   ...... (refer to the "channel" argument of rcservo_SetServo())
    //-- if the above functions return false, roboio_GetErrCode() may return:
    //   #define ERROR_RCSERVO_INUSE             (ERR_NOERROR + 400)
    //   #define ERROR_RCSERVO_WRONGCHANNEL      (ERR_NOERROR + 462)
         #define ERROR_RCSERVO_INVALIDPARAMS     (ERR_NOERROR + 463)
     
    RBAPI(bool) rcservo_SetReadFBParams1(int channel, unsigned long initdelay, unsigned long lastdelay, unsigned long maxwidth);
    RBAPI(bool) rcservo_SetReadFBParams2(int channel, unsigned long resolution, long offset);
    RBAPI(bool) rcservo_SetReadFBParams3(int channel, int maxfails, int filterwidth);
    //-- values for the "channel" argument
    //   #define RCSERVO_PINS1                   (0)
    //   #define RCSERVO_PINS2                   (1)
    //   ...... (refer to the "channel" argument of rcservo_SetServo())
    //-- if the above functions return false, roboio_GetErrCode() may return:
    //   #define ERROR_RCSERVO_INUSE             (ERR_NOERROR + 400)
    //   #define ERROR_RCSERVO_WRONGCHANNEL      (ERR_NOERROR + 462)
    //   #define ERROR_RCSERVO_INVALIDPARAMS     (ERR_NOERROR + 463)
     
    RBAPI(bool) rcservo_SetCmdPulse(int channel, int cmd, unsigned long duty);
    RBAPI(bool) rcservo_SetPlayModeCMD(int channel, int cmd);
    //-- values for the "channel" argument
    //   #define RCSERVO_PINS1                   (0)
    //   #define RCSERVO_PINS2                   (1)
    //   ...... (refer to the "channel" argument of rcservo_SetServo())
    //-- values for the "cmd" argument
         #define RCSERVO_CMD_POWEROFF            (0)
         #define RCSERVO_CMD1                    (1)
         #define RCSERVO_CMD2                    (2)
         #define RCSERVO_CMD3                    (3)
         #define RCSERVO_CMD4                    (4)
         #define RCSERVO_CMD5                    (5)
         #define RCSERVO_CMD6                    (6)
         #define RCSERVO_CMD7                    (7)
    //-- if the above function return false, roboio_GetErrCode() may return:
    //   #define ERROR_RCSERVO_WRONGCHANNEL      (ERR_NOERROR + 462)
    //   #define ERROR_RCSERVO_INVALIDPARAMS     (ERR_NOERROR + 463)
     
     
     
    //******************  Functions in Capture Mode  *********************
    RBAPI(void) rcservo_EnterCaptureMode(void);
     
    RBAPI(unsigned long) rcservo_ReadPosition(int channel, int cmd);
    RBAPI(unsigned long) rcservo_ReadPositionDN(int channel, int cmd);  // for backward compatibility to RoBoIO 1.1
    //-- values for the "channel" argument
    //   #define RCSERVO_PINS1                   (0)
    //   #define RCSERVO_PINS2                   (1)
    //   ...... (refer to the "channel" argument of rcservo_SetServo())
    RBAPI(void) rcservo_ReadPositions(unsigned long channels, int cmd, unsigned long* width);
    RBAPI(void) rcservo_ReadPositionsDN(unsigned long channels, int cmd, unsigned long* width);  // for backward compatibility to RoBoIO 1.1
    //-- values for the "channels" argument (note that different values can be added to use multiple channels)
    //   #define RCSERVO_USEPINS1                (1L)
    //   #define RCSERVO_USEPINS2                (1L<<1)
    //   ...... (refer to the "usedchannels" argument of rcservo_Init())
    //-- values for the "cmd" argument
    //   #define RCSERVO_CMD_POWEROFF            (0)
    //   #define RCSERVO_CMD1                    (1)
    //   ...... (refer to the "cmd" argument of rcservo_SetCmdPulse())
    //-- each return value (= 0xffffffffL if fails) of the above functions indicates the length of the feedback pulse,
    //   which is equal to [return value] * [resolution] * 0.1us, where [resolution] is set by rcservo_SetReadFBParams2()
     
    RBAPI(unsigned long) rcservo_CapOne(int channel);  // simplified version of rcservo_ReadPosition()
    RBAPI(bool) rcservo_CapAll(unsigned long* width);  // simplified version of rcservo_ReadPositions()
     
    //enable/disable multiprogramming OS heuristic
    RBAPI(void) rcservo_EnableMPOS(void);
    RBAPI(void) rcservo_DisableMPOS(void);
     
    RBAPI(void) rcservo_SendCMD(int channel, int cmd);
    //-- values for the "channels" argument (note that different values can be added to use multiple channels)
    //   #define RCSERVO_USEPINS1                (1L)
    //   #define RCSERVO_USEPINS2                (1L<<1)
    //   ...... (refer to the "usedchannels" argument of rcservo_Init())
    //-- values for the "cmd" argument
    //   #define RCSERVO_CMD_POWEROFF            (0)
    //   #define RCSERVO_CMD1                    (1)
    //   ...... (refer to the "cmd" argument of rcservo_SetCmdPulse())
     
     
     
    //******************  Functions in Play Mode  ************************
    RBAPI(void) rcservo_EnterPlayMode(void);
    RBAPI(void) rcservo_EnterPlayMode_NOFB(unsigned long* width);
    RBAPI(void) rcservo_EnterPlayMode_HOME(unsigned long* width);
     
    RBAPI(void) rcservo_SetFPS(int fps);
    RBAPI(void) rcservo_SetAction(unsigned long* width, unsigned long playtime);
     
    RBAPI(int)  rcservo_PlayAction(void);
    RBAPI(int)  rcservo_PlayActionMix(long* mixwidth);
    //-- return values of rcservo_PlayAction()
         #define RCSERVO_PLAYEND                 (0)
         #define RCSERVO_PLAYING                 (1)
         #define RCSERVO_PAUSED                  (2)
    //-- special width values for mixwidth[i]
         #define RCSERVO_MIXWIDTH_POWEROFF       (0x7fffff00L)
         #define RCSERVO_MIXWIDTH_CMD1           (0x7fffff01L)
         #define RCSERVO_MIXWIDTH_CMD2           (0x7fffff02L)
         #define RCSERVO_MIXWIDTH_CMD3           (0x7fffff03L)
         #define RCSERVO_MIXWIDTH_CMD4           (0x7fffff04L)
         #define RCSERVO_MIXWIDTH_CMD5           (0x7fffff05L)
         #define RCSERVO_MIXWIDTH_CMD6           (0x7fffff06L)
         #define RCSERVO_MIXWIDTH_CMD7           (0x7fffff07L)
     
    RBAPI(void) rcservo_PauseAction(void);
    RBAPI(void) rcservo_ReleaseAction(void);
    RBAPI(void) rcservo_StopAction(void);
    RBAPI(void) rcservo_GetAction(unsigned long* width);
     
    RBAPI(void) rcservo_MoveTo(unsigned long* width, unsigned long playtime);
    RBAPI(void) rcservo_MoveOne(int channel, unsigned long pos, unsigned long playtime);
     
     
     
    //******************  Functions in PWM Mode  *************************
    RBAPI(void) rcservo_EnterPWMMode(void);
     
    RBAPI(bool) rcservo_SendPWM(int channel, unsigned long period, unsigned long duty, unsigned long count);
    RBAPI(bool) rcservo_SendCPWM(int channel, unsigned long period, unsigned long duty);
    //-- values for the "channel" argument
    //   #define RCSERVO_PINS1                   (0)
    //   #define RCSERVO_PINS2                   (1)
    //   ...... (refer to the "channel" argument of rcservo_SetServo())
    //-- if the above function returns false, roboio_GetErrCode() may return:
         #define ERROR_RCSERVO_PWMFAIL           (ERR_NOERROR + 430)
     
    RBAPI(void) rcservo_StopPWM(int channel);
    //-- values for the "channel" argument
    //   #define RCSERVO_PINS1                   (0)
    //   #define RCSERVO_PINS2                   (1)
    //   ...... (refer to the "channel" argument of rcservo_SetServo())
     
    RBAPI(unsigned long) rcservo_CheckPWM(int channel);
    //-- values for the "channel" argument
    //   #define RCSERVO_PINS1                   (0)
    //   #define RCSERVO_PINS2                   (1)
    //   ...... (refer to the "channel" argument of rcservo_SetServo())
    //-- returns the remaining number of pulses to send (returns 0xffffffffL for continuous pulses)
     
     
     
    //*******************  Functions for GPIO Channels  ******************
    RBAPI(void) rcservo_OutPin(int channel, int value);
    RBAPI(int)  rcservo_InPin(int channel);
    //-- values for the "channel" argument
    //   #define RCSERVO_PINS1                   (0)
    //   #define RCSERVO_PINS2                   (1)
    //   ...... (refer to the "channel" argument of rcservo_SetServo())
     
    RBAPI(void) rcservo_OutPort(unsigned long channels, unsigned long values);
    RBAPI(unsigned long) rcservo_InPort(unsigned long channels);
    //-- values for the "channels" argument (note that different values can be added to use multiple channels)
    //   #define RCSERVO_USEPINS1                (1L)
    //   #define RCSERVO_USEPINS2                (1L<<1)
    //   ...... (refer to the "usedchannels" argument of rcservo_Init())
     
     
     
    //***********  Constants for Compatibility to RoBoIO 1.61  ***********
    #define RCSERVO_USENOCHANNEL	    (0L)
    #define RCSERVO_USECHANNEL0			(1L)
    #define RCSERVO_USECHANNEL1			(1L<<1)
    #define RCSERVO_USECHANNEL2			(1L<<2)
    #define RCSERVO_USECHANNEL3			(1L<<3)
    #define RCSERVO_USECHANNEL4			(1L<<4)
    #define RCSERVO_USECHANNEL5			(1L<<5)
    #define RCSERVO_USECHANNEL6			(1L<<6)
    #define RCSERVO_USECHANNEL7			(1L<<7)
    #define RCSERVO_USECHANNEL8			(1L<<8)
    #define RCSERVO_USECHANNEL9			(1L<<9)
    #define RCSERVO_USECHANNEL10		(1L<<10)
    #define RCSERVO_USECHANNEL11		(1L<<11)
    #define RCSERVO_USECHANNEL12		(1L<<12)
    #define RCSERVO_USECHANNEL13		(1L<<13)
    #define RCSERVO_USECHANNEL14		(1L<<14)
    #define RCSERVO_USECHANNEL15		(1L<<15)
    #define RCSERVO_USECHANNEL16		(1L<<16)  // only for RoBoard RB-100/RB-100b1/RB-100b2
    #define RCSERVO_USECHANNEL17		(1L<<17)  // only for RoBoard RB-100/RB-100b1/RB-100b2
    #define RCSERVO_USECHANNEL18		(1L<<18)  // only for RoBoard RB-100/RB-100b1/RB-100b2
    #define RCSERVO_USECHANNEL19		(1L<<19)  // only for RoBoard RB-100/RB-100b1/RB-100b2
    #define RCSERVO_USECHANNEL20		(1L<<20)  // only for RoBoard RB-100/RB-100b1/RB-100b2
    #define RCSERVO_USECHANNEL21		(1L<<21)  // only for RoBoard RB-100/RB-100b1/RB-100b2
    #define RCSERVO_USECHANNEL22		(1L<<22)  // only for RoBoard RB-100/RB-100b1/RB-100b2
    #define RCSERVO_USECHANNEL23		(1L<<23)  // only for RoBoard RB-100/RB-100b1/RB-100b2
    #define RCSERVO_USECHANNEL24		(1L<<24)  // only for RoBoard RB-100b1
    #define RCSERVO_USECHANNEL25		(1L<<25)  // only for RoBoard RB-100b1
    #define RCSERVO_USECHANNEL26		(1L<<26)  // only for RoBoard RB-100b1
    #define RCSERVO_USECHANNEL27		(1L<<27)  // only for RoBoard RB-100b1
    #define RCSERVO_USECHANNEL28		(1L<<28)  // only for RoBoard RB-100b1
    #define RCSERVO_USECHANNEL29		(1L<<29)  // only for RoBoard RB-100b1
    #define RCSERVO_USECHANNEL30		(1L<<30)  // only for RoBoard RB-100b1
    #define RCSERVO_USECHANNEL31		(1L<<31)  // only for RoBoard RB-100b1
     
    RBAPI(bool) rcservo_Initialize(unsigned long usedchannels);  // for compatibility to RoBoIO 1.61
     
     
    #ifdef __cplusplus
    }
    #endif
     
     
     
    /****************************  Inline Functions  **************************/
    #ifdef ROBOIO_DLL //use no inline functions for DLL
    #ifdef __cplusplus
    extern "C" {
    #endif
        // for compatibility to RoBoIO 1.61
        RBAPI(void) rcservo_MoveToMix(unsigned long* width, unsigned long playtime, long* mixwidth);
        RBAPI(bool) rcservo_SendPWMPulses(int channel, unsigned long period, unsigned long duty, unsigned long count);
        RBAPI(bool) rcservo_IsPWMCompleted(int channel);
        RBAPI(void) rcservo_Outp(int channel, int value);
        RBAPI(int) rcservo_Inp(int channel);
        RBAPI(void) rcservo_Outps(unsigned long channels, unsigned long value);
        RBAPI(unsigned long) rcservo_Inps(unsigned long channels);
    #ifdef __cplusplus
    }
    #endif
    #endif
     
    #if !defined(ROBOIO_DLL) || defined(__RCSERVO_LIB)
        // for compatibility to RoBoIO 1.61
        RB_INLINE RBAPI(void) rcservo_MoveToMix(unsigned long* width, unsigned long playtime, long* mixwidth) {
            rcservo_SetAction(width, playtime);
            while (rcservo_PlayActionMix(mixwidth) != RCSERVO_PLAYEND);
        }
        RB_INLINE RBAPI(bool) rcservo_SendPWMPulses(int channel, unsigned long period, unsigned long duty, unsigned long count) {
            return rcservo_SendPWM(channel, period, duty, count);
        }
        RB_INLINE RBAPI(bool) rcservo_IsPWMCompleted(int channel) {
            if (rcservo_CheckPWM(channel) == 0L) return true; else return false;
        }
        RB_INLINE RBAPI(void) rcservo_Outp(int channel, int value) {
            rcservo_OutPin(channel, value);
        }
        RB_INLINE RBAPI(int) rcservo_Inp(int channel) {
            return rcservo_InPin(channel);
        }
        RB_INLINE RBAPI(void) rcservo_Outps(unsigned long channels, unsigned long value) {
            rcservo_OutPort(channels, value);
        }
        RB_INLINE RBAPI(unsigned long) rcservo_Inps(unsigned long channels) {
            return rcservo_InPort(channels);
        }
    #endif
    /*-----------------------  end of Inline Functions  ----------------------*/
     
    #endif
    Dans les logs seuls 3 fichiers sur ceux inclus dans roboard.h semblent poser problème.

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Cela me donne l'impression que le mot clé RBINLINE n'a pas été correctement transformé en static inline, mais peut-être en inline. Conséquence : les gardes d'inclusions marchent pour chaque unité de compilation mais si tu inclues le fichier dans 2 unités de compilation différentes, la fonction est définie 2 fois. As-tu inclus ce fichier h dans 2 fichiers c à toi ?

    T'es tu intéressé à ces 2 macros ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #if !defined(ROBOIO_DLL) || defined(__RCSERVO_LIB)
    Sont-elles définies ou pas et pour quelles raisons ? Y a -il un fichier c de la lib qui contient aussi la définition de la fonction ?

  7. #7
    Membre expérimenté Avatar de RPGamer
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Mars 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués

    Informations forums :
    Inscription : Mars 2010
    Messages : 168
    Par défaut
    Il y a un fichier defines.h qui défini normalement la plupart de ces macros.

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    #ifndef __DEFINES_H
    #define __DEFINES_H
     
    #define ROBOIO  (0x0181)  // enable specific constraints for RoBoard
     
     
    //#if (__BORLANDC__ >= 0x0400) && (__BORLANDC__ <= 0x0520)  // BC3.0 ~ BC5.02
    #if (defined(__BORLANDC__) || defined(__TURBOC__)) && !defined(__WIN32__)
        #define RB_BC_DOS
     
        #if defined(__BORLANDC__) && ((__BORLANDC__ == 0x0400) || (__BORLANDC__ == 0x0410) || (__BORLANDC__ == 0x0452))
            #define RB_BC30
        #endif
     
        #if defined(RB_BC30) || (defined(__TURBOC__) && !defined(__BORLANDC__))
            typedef int bool;
            #define true  (1==1)
            #define false (1==0)
     
            #define __FUNCB__(x)    #x              // for stringizing __LINE__
            #define __FUNCA__(x)    __FUNCB__(x)    // for stringizing __LINE__
            #define __FUNCTION__    (__FILE__ "[line " __FUNCA__(__LINE__) "]")
        #endif
    #endif
     
    #if defined(__BORLANDC__) && defined(__WIN32__)
        #if __BORLANDC__ < 0x0520
            #define RB_BC_WIN32
        #else
            #define RB_BCB_WIN32
        #endif
    #endif
     
    #if defined (DJGPP)
        #define RB_DJGPP
    #endif
     
    #if defined (__WATCOMC__) && defined(__386__)
        #define RB_WATCOM
    #endif
     
    #if defined(__GNUC__) && defined(linux) //&& defined(__i386__)
        #define RB_LINUX
    #endif
     
    #if defined(_MSC_VER) //&& defined(_M_IX86)
        #if defined   (WINCE)
            #define RB_MSVC_WINCE
        #elif defined (WIN32)
            #define RB_MSVC_WIN32
        #endif
    #endif
     
     
    #if defined __cplusplus
        #define _RB_INLINE  static inline
    #elif defined(DJGPP)
        #define _RB_INLINE  __INLINE__
    #elif defined(__GNUC__)
        #define _RB_INLINE  __inline__
    #elif defined(_MSC_VER)
        #define _RB_INLINE  __inline
    #else
        #define _RB_INLINE  static
    #endif
     
     
    #if defined(RB_MSVC_WIN32) || defined(RB_MSVC_WINCE)
        //#define ROBOIO_DLL
    	//#define DLL_EXPORTING
    #endif
     
    #ifdef ROBOIO_DLL
        #ifdef DLL_EXPORTING
            #define RBAPI(rtype)    __declspec(dllexport) rtype __stdcall
            #define _RBAPI_C(rtype) __declspec(dllexport) rtype __cdecl
        #else
            #define RBAPI(rtype)    __declspec(dllimport) rtype __stdcall
            #define _RBAPI_C(rtype) __declspec(dllimport) rtype __cdecl
        #endif
     
        #define RB_INLINE
    #else
        #define RBAPI(rtype)    rtype
        #define _RBAPI_C(rtype) rtype
        #define RB_INLINE       _RB_INLINE
    #endif //ROBOIO_DLL
     
    #endif
    Pour RB_INLINE ce sont les lignes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #if defined __cplusplus
        #define _RB_INLINE  static inline
    #elif defined(DJGPP)
        #define _RB_INLINE  __INLINE__
    #elif defined(__GNUC__)
        #define _RB_INLINE  __inline__
    #elif defined(_MSC_VER)
        #define _RB_INLINE  __inline
    #else
        #define _RB_INLINE  static
    #endif
    Pour ROBOIO_DLL, la définition est visiblement en commentaire, elle est probablement utilisée pour du code compilé pour Windows (j'ai téléchargé les binaires et le code source pour Linux). Et __RCSERVO_LIB est définie au début du fichier rcservo.c qui inclu le fichier rcservo.h.

    As-tu inclus ce fichier h dans 2 fichiers c à toi ?
    Je n'ai jamais inclu le fichier rcservo.h directement mais le fichier roboard.h de mon 2ème message est inclus dans plusieurs .c à moi oui.

    Le corps de la fonctio rcservo_MoveToMix() n'est pas défini dans le fichier rcservo.c.

    Edit :

    J'ai remplacé ces lignes selon tes suppositions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #elif defined(__GNUC__)
        #define _RB_INLINE  __inline__
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #elif defined(__GNUC__)
        #define _RB_INLINE  static __inline__
    et ça à l'air de ne plus me poser problème !

    Donc c'était effectivement ça merci

    En revanche j'ai un autre souci mais qui cette fois est lié à l'architecture cible. Je compile sur un Core i7 (x64_86 je pense) pour le processeur de la RoBoard qui est un Vorted86DX (x86 donc). Du coup j'ai pris la version déjà compilée avec le .a pour x86 (si je compile moi-meme pour x86 ça ne change rien en fait). Pour compiler mon projet, j'ai rajouté l'option -m32 de GCC. J'obtiens la sortie suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ||=== small-robot, Debug ===|
    /home/cyril/Documents/RBT/crh-2014/src/small-robot/jobs/fire_conquest.c|18|warning: ‘fq_init’ defined but not used [-Wunused-function]|
    /home/cyril/Documents/RBT/crh-2014/src/small-robot/move.c|363|warning: ‘move_update_from_tmcl’ defined but not used [-Wunused-function]|
    ../RoBoIO/Lib/libRBIO.a(common.o)||In function `timer_nowtime':|
    common.cpp|| undefined reference to `__udivdi3'|
    ||=== Build finished: 1 errors, 2 warnings (0 minutes, 0 seconds) ===|
    En faisant des recherches il y a quelques temps j'ai lu qu'il s'agissait d'un problème de division qui se faisait dans le mauvais mode (64 bits au lieu de 32 ou l'inverse je sais plus). J'ai lu aussi qu'il existe une fonction do_div() pour forcer une division sur 64 bits en incluant le fichier asm/div64.h. Mais je pense qu'il s'agit d'un tour de passe passe pour compiler sur une architecture 32 bits car le fichier asm/div64.h n'existe pas chez moi.

    Voici la sortie des logs :

    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
    50
    51
    -------------- Clean: Debug in small-robot (compiler: GNU GCC Compiler)---------------
     
    Cleaned "small-robot - Debug"
     
    -------------- Build: Debug in small-robot (compiler: GNU GCC Compiler)---------------
     
    gcc -Wall  -g -m32    -I../RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/beacon.c -o obj/Debug/beacon.o
    gcc -Wall  -g -m32    -I../RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/io/gpio.c -o obj/Debug/io/gpio.o
    gcc -Wall  -g -m32    -I../RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/io/io.c -o obj/Debug/io/io.o
    gcc -Wall  -g -m32    -I../RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/io/sensor.c -o obj/Debug/io/sensor.o
    gcc -Wall  -g -m32    -I../RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/io/servo.c -o obj/Debug/io/servo.o
    gcc -Wall  -g -m32    -I../RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/io/tmcl.c -o obj/Debug/io/tmcl.o
    gcc -Wall  -g -m32    -I../RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/jobs/fire_conquest.c -o obj/Debug/jobs/fire_conquest.o
    /home/cyril/Documents/RBT/crh-2014/src/small-robot/jobs/fire_conquest.c:18:13: warning: ‘fq_init’ defined but not used [-Wunused-function]
     static void fq_init(void) {
                 ^
    gcc -Wall  -g -m32    -I../RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/jobs/fresco.c -o obj/Debug/jobs/fresco.o
    gcc -Wall  -g -m32    -I../RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/jobs/shooting_mammoths.c -o obj/Debug/jobs/shooting_mammoths.o
    gcc -Wall  -g -m32    -I../RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/main.c -o obj/Debug/main.o
    gcc -Wall  -g -m32    -I../RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/motion/avoid.c -o obj/Debug/motion/avoid.o
    gcc -Wall  -g -m32    -I../RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/move.c -o obj/Debug/move.o
    /home/cyril/Documents/RBT/crh-2014/src/small-robot/move.c:363:19: warning: ‘move_update_from_tmcl’ defined but not used [-Wunused-function]
     static MOVE_ERROR move_update_from_tmcl(void)
                       ^
    gcc -Wall  -g -m32    -I../RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/strategies/strategy1.c -o obj/Debug/strategies/strategy1.o
    gcc -Wall  -g -m32    -I../RoBoIO/Include  -c /home/cyril/Documents/RBT/crh-2014/src/small-robot/vector.c -o obj/Debug/vector.o
    g++ -L../RoBoIO/Lib  -o bin/Debug/small-robot obj/Debug/beacon.o obj/Debug/io/gpio.o obj/Debug/io/io.o obj/Debug/io/sensor.o obj/Debug/io/servo.o obj/Debug/io/tmcl.o obj/Debug/jobs/fire_conquest.o obj/Debug/jobs/fresco.o obj/Debug/jobs/shooting_mammoths.o obj/Debug/main.o obj/Debug/motion/avoid.o obj/Debug/move.o obj/Debug/strategies/strategy1.o obj/Debug/vector.o   -lpthread  ../RoBoIO/Lib/libRBIO.a 
    /usr/bin/ld: i386 architecture of input file `obj/Debug/beacon.o' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `obj/Debug/io/gpio.o' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `obj/Debug/io/io.o' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `obj/Debug/io/sensor.o' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `obj/Debug/io/servo.o' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `obj/Debug/io/tmcl.o' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `obj/Debug/jobs/fire_conquest.o' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `obj/Debug/jobs/fresco.o' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `obj/Debug/jobs/shooting_mammoths.o' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `obj/Debug/main.o' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `obj/Debug/motion/avoid.o' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `obj/Debug/move.o' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `obj/Debug/strategies/strategy1.o' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `obj/Debug/vector.o' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `../RoBoIO/Lib/libRBIO.a(common.o)' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `../RoBoIO/Lib/libRBIO.a(rcservo.o)' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `../RoBoIO/Lib/libRBIO.a(io.o)' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `../RoBoIO/Lib/libRBIO.a(pwm.o)' is incompatible with i386:x86-64 output
    /usr/bin/ld: i386 architecture of input file `../RoBoIO/Lib/libRBIO.a(pwmdx.o)' is incompatible with i386:x86-64 output
    ../RoBoIO/Lib/libRBIO.a(common.o): In function `timer_nowtime':
    common.cpp:(.text+0x32c): undefined reference to `__udivdi3'
    collect2: error: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)
    1 errors, 2 warnings (0 minutes, 0 seconds)
    Une idée pour me mettre sur la voie ?
    Merci encore ^.^

    Edit 2 :

    C'est bon j'ai trouvé, j'ai ajouté également l'option -m32 aussi dans les options du linker.
    Merci.

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

Discussions similaires

  1. Problème de mapping sur une classe externe
    Par jean-pierre96 dans le forum Hibernate
    Réponses: 2
    Dernier message: 04/08/2010, 16h51
  2. Réponses: 4
    Dernier message: 16/06/2005, 15h37
  3. Problème de select sur une date (DATETIME....)
    Par zeldoi5 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 16/05/2005, 11h19
  4. probléme de cadre sur une image qui me sert de lien
    Par thomas_chamas dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 26/11/2004, 17h36
  5. Problème de chaine sur une page HTML
    Par Kerod dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 23/11/2004, 16h23

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