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 :

Création d'une librairie dynamique en C -> échec


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pérou

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2013
    Messages : 201
    Par défaut Création d'une librairie dynamique en C -> échec
    Bonjour,

    Je cherche à créer une librairie composée de plusieurs objets. Voici les commandes entrées à la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    export C8_DEV=' -O0 -D_GNU_SOURCE -std=c99 -fstrict-aliasing -fwrapv -Wall -Wextra -g -iquote ./ -fmax-errors=10 '
     
    gcc -fPIC -o obj/6303_modbu.o -c procs/6303/6303_modbu.c $C8_DEV
    gcc -fPIC -o obj/6303_mocmd.o -c procs/6303/6303_mocmd.c $C8_DEV
    gcc -fPIC -o obj/6303_emu.o -c procs/6303/6303_emu.c $C8_DEV
     
    gcc -c -fPIC -o obj/lib_6303.o -o obj/6303_emu.o -o obj/6303_mocmd.o -o obj/6303_modbu.o procs/6303/6303_lib.c $C8_DEV
    gcc -shared -o lib/lib_6303.o -o obj/lib_6303.so
    Aucune des lignes 3, 4 et 5 ne génère d'erreur, et les objets sont bien créés. La ligne 7 ne génère pas d'erreur non plus, mais l'objet "obj/lib_6303.o" n'est pas créé, ce qui abouti évidemment à une erreur fatale à la ligne 8. L'erreur est probablement sous mon nez, mais je ne la trouve pas.

    Je suppose que la personne susceptible de m'aider ne nécessite pas plus d'information. Cette personne aurait-elle une idée et le temps de m'aider avec une courte réponse, s'il lui plaît ?

    Merci pour votre attention.

    Edit : GNU C (SUSE Linux) version 4.8.5 (x86_64-suse-linux)

  2. #2
    Membre très actif

    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pérou

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2013
    Messages : 201
    Par défaut
    L'option de compilation "-fPIC" est piégeante, mais ce n'est pas elle.
    Même pas une direction dans laquelle regarder ?

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 129
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 129
    Par défaut
    Citation Envoyé par Paul_Le_Heros Voir le message
    [...] ce qui aboutit évidemment à une erreur fatale à la ligne 8. L'erreur est probablement sous mon nez, [...]
    Mais pas sous le nôtre, puisque tu ne nous la donnes pas...

    Et comme , on n'ira pas loin...

  4. #4
    Membre très actif

    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pérou

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2013
    Messages : 201
    Par défaut Merci Jean-Marc (liste opensuse-fr@opensuse.org)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    1 export C8_DEV=' -O0 … '
    2 gcc -fPIC -o obj/6303_modbu.o -c procs/6303/6303_modbu.c $C8_DEV
    3 gcc -fPIC -o obj/6303_mocmd.o -c procs/6303/6303_mocmd.c $C8_DEV
    4 gcc -fPIC -o obj/6303_emu.o -c procs/6303/6303_emu.c $C8_DEV
    5
    6 gcc -fPIC -o obj/6303_lib.o -c procs/6303/6303_lib.c $C8_DEV
    3 gcc -shared -fPIC -o obj/lib_6303.so obj/6303_modbu.o obj/6303_mocmd.o obj/6303_emu.o obj/6303_lib.o
    Il semble bien que ce soit un problème de linker, puisque parmi les erreurs, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    …
        obj/6303_mocmd.o:./src/l8.h:195 : définitions multiples de « foo »
        obj/6303_modbu.o:./src/l8.h:195 : défini pour la première fois ici
    …
    Les messages ne sont guère plus clairs que ça, mais j'ai de quoi résoudre
    mon problème.

    Je conclue que c'est comme ça qu'on est supposé faire, c'est à dire ne "lier" les objets qu'au dernier moment… ce qui est finalement logique puisque le linker n'est invoqué qu'à ce moment-là (@Jipété_Le_Grand : comme quoi, pas besoin de plus d'info, ni de boule de cristal).

    Merci pour votre attention et vos réponses.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2013
    Messages : 24
    Par défaut madame irma est en vacance
    et si tu nous donnais les éléments pour pouvoir test ca chez nous ?

  6. #6
    Membre très actif

    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pérou

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2013
    Messages : 201
    Par défaut make
    En fait j'étudiais "make", et je croyais (apparemment je me suis trompé) que le make "exécutait" récursivement le fichier "makefile" (ou autre nom suivant prorité / option). Mais non. Puisque make fonctionne correctement maintenant, j'en conclue qu'Il faut commencer par définir la règle de construction du fichier logiquement le "dernier" construit par l'humain (enfin, plutôt inhumaine, la bête). Ce que nous faisons habituellement est à peu près ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    1: écrire un ".h",
    2: écrire le ".c" correspondant,
    3: lancer gcc pour créer un ".o",
    4: lancer gcc pour créer un ".so",
    5: lancer gcc pour créer le "main.o" et enfin
    6: lancer gcc (ou ld) pour lier "main.o" au ".so" et créer l'exécutable.
    Mon fichier "makefile" fonctionne depuis que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a- j’ai défini la règle pour la construction de l’éxécutable (5: 6:),
    b- j’ai défini la règle pour la construction du ".so" (4)
    c- j’ai défini la règle pour la construction du ".o" (3)
    et ce, dans cet ordre, donc sans respecter un ordre plus logique. EDIT J'avais pourtant noter cet ordre "inverse" dans un des tutos relatifs à make et consultables sur ce site.

    Quelqu'un pour confirmer que je ne me trompe pas (encore) ?

  7. #7
    Membre très actif

    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2013
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Pérou

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2013
    Messages : 201
    Par défaut
    Si vous décompressez _3.tar.gz dans votre répertoire personnel, vous aurez créé un sous-répertoire contenant ceci :

    ~/_3/
    ├──bin/
    ├──lib/
    ├──obj/
    ├──src/
    │ ├──lib_8.c
    │ ├──lib_8.h
    │ └──main.c
    └──makefile

    Pourquoi au premier lancement de "make -C ~/_3/↵", se passe-t-il aussi peu de choses ?

    Vous pouvez construire ce fabuleux projet en saisissant "make -C ~/_3/ all↵" dans une console. J'ai ajouté l'impression en couleur pour faciliter le débogage.

    Je ne comprend pas pourquoi, après avoir saisi "make -C ~/_3/↵", rien ne se passe alors que lib/lib_8.so a été supprimé (ou en ajoutant "--assume-new=lib/lib_8.so" à la commande). Quelqu'un saurait parler de la raison ?

    Quelqu'un a déjà utilisé l'option -B (Unconditionally make all targets) ?

    Merci pour l'attention que vous aurez portée à ce post.

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

Discussions similaires

  1. Création d'une librairie dynamique avec gcc
    Par ba10 dans le forum Autres éditeurs
    Réponses: 0
    Dernier message: 16/12/2009, 19h20
  2. Compiler et créer une librairie dynamique en C
    Par fidififouille dans le forum Linux
    Réponses: 3
    Dernier message: 30/11/2004, 16h36
  3. Création d'une librairie ???
    Par Mike888 dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 10/10/2004, 12h16
  4. création d'une librairie dynamique
    Par bilo2000 dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 26/08/2004, 15h17
  5. [Plugin] Création d'une vue dynamiquement
    Par The Bonze dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 15/06/2004, 13h23

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