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

  1. #1
    Membre averti

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2013
    Messages : 182
    Points : 375
    Points
    375
    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 averti

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2013
    Messages : 182
    Points : 375
    Points
    375
    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 éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    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...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Membre averti

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2013
    Messages : 182
    Points : 375
    Points
    375
    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
    Nouveau membre du Club
    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
    Points : 28
    Points
    28
    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 averti

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2013
    Messages : 182
    Points : 375
    Points
    375
    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 averti

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2013
    Messages : 182
    Points : 375
    Points
    375
    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.

  8. #8
    Membre averti

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2013
    Messages : 182
    Points : 375
    Points
    375
    Par défaut Mes difficultés avec l'utilitaire "make"
    Jusqu'à maintenant, j'ai toujours fait sans make, même pour le projet en exemple. J'ai voulu passer à make maintenant, et chercher à comprendre sans abandonner en "jetant le bébé et l'eau du bain", comme jusqu'à maintenant. J'ai cru que mes fichiers "Makefile" ne fonctionnaient pas (de là à penser que make lui-même…). J'ai d'abord été perturbé par les messages de make, parce que ce qui suit le nom d'une règle, soit le nom résultat d'une compilation, et sont les dépendances, est une liste de règles et ou de fichiers. Or, les messages d'erreur de make ne parle que de RÈGLE tout en vous en indiquant son nom, et si ce nom est celui d'un fichier, vous pouvez être perdu.

    J'avais l'impression que make ne fonctionnait pas bien avant que je ne me rende compte que c'était parce que les dépendances n'étaient pas complètes. Parlant du langage C, l'option "-MM" de gcc est très utile pour déterminer ces dépendances. J'ai écrit en php un petit utilitaire _help.tar.gz pas très pratique mais qui permet de visualiser ces dépendances. Noter que si un fichiers .o ou .so est généré à partir de la source "a" et avec des dépendances aux fichiers d0 et d1, et que les dépendances d'une règle ailleurs comprennent également d0 et d1, il est préférable de rendre cette dernière règle dépendante de la règle construisant le .o ou .so.
    Par exemple, écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    lib/lib_dys.so: src/ThrDynStr.c src/ThrDynStr.h src/Vt-200.color.h
    	@gcc …
    lib/lib_symbo.so: src/Symbo.c src/Symbo.h src/Symbo_debug.c lib/lib_dys.so
    	@gcc
    plutôt que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    lib/lib_dys.so: src/ThrDynStr.c src/ThrDynStr.h src/Vt-200.color.h
    	@gcc …
    lib/lib_symbo.so: src/Symbo.c src/Symbo.h src/Symbo_debug.c src/ThrDynStr.c src/ThrDynStr.h src/Vt-200.color.h
    	@gcc
    En espérant aider d'autres newbies dans l'utilisation de make.

    NOTE au modérateur(s) : si vous pensez que ce post peut être utile, peut-être serait-il bien de changer le titre du thread pour qu'il comporte le mot "make"

+ 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