CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

GCC bibliothèque .so

Aldebran
Aldebran
Niveau 10
15 mai 2009 à 21:50:43

Salut à tous, j'ai trois headers a.h, b.h et c.h (et les sources associées a.c, b.c, c.c) et j'ai un fichier all.h dans lequel j'ai un include sur a.h, b.h, c.h (car les fonctions de all.h dépendent de ces fichiers).

Je pensais pouvoir créer une bibliothèque liball.so en entrant la commande suivante :
gcc -o liball.so -shared -fpic all.c

Mais manifestement ça marche pas :(
La compilation de la bibliothèque se déroule sans problème et sans warning, mais quand j'essaye de compiler le main avec l'option -lall, je m'aperçois que les fonctions des fichiers a.h, b.h et c.h n'ont pas l'air d'avoir été incluse dans la bibliothèque liball.so, et j'ai du undefined reference sur les fonctions de a.h, b.h et c.h. D'où vient le problème ?

chris_27
chris_27
Niveau 10
16 mai 2009 à 01:59:51

Je ne suis pas sûr de ce que tu cherches à faire, mais en général on fait des choses comme ça :

$ gcc -c a.c
$ gcc -c b.c
$ gcc -c c.c
$ gcc -o all a.o b.o c.o all.c

Note que ça devient vite très lourd de faire ça et que les gens utilisent souvent un Makefile pour automatiser la chose :
http://gl.developpez.com/tutoriel/outil/makefile/

Aldebran
Aldebran
Niveau 10
16 mai 2009 à 10:39:13

Merci, ça marche mieux comme ça :) (en rajoutant les options -shared et -fpic bien sûr)

Sinon, je suis en train d'apprendre à utiliser make, c'est vrai que c'est plus efficace mais je suis pas encore très à l'aise avec :( En particulier parce que dans mon projet j'ai des sources dispersées dans plein de répertoires différents, et j'ai du mal à trouver comment utiliser make efficacement avec tout mes répertoires.

dnob700
dnob700
Niveau 10
16 mai 2009 à 10:54:47

La solution de cris est valable, mais tu peut te passer de la compilation en deux étape en donnant tout les fichiers sources à gcc en même temps :

gcc -o liball.so -shared -fpic all.c a.c b.c c.c

Tu semble donner beaucoup d'inportance au fichier d'en tête. Mais sache que ceux-ci ne contiennent aucune information pour la compilation, seul les fichiers sources compte. Inclure, par exemple, a.h, b.h et c.h dans all.h n'est pas faux, mais si les fonction de all.c utilise les fonctions de ces fichiers source, mais pas les fonctions qui appelleront celle de all.c, alors c'est dans all.c qu'il faut inclure ces en tête et non pas dans all.h. En effet, tu va distribuer all.h avec ta bibliothèque, mais si tu ne distribue pas les autres en tête avec, ça vas poser des problème (tel que tu l'a fait pour l'instant).

Et pour ton problème plus directement, les fichiers sources n'ont pas forcément de fichier d'en tête associé, ou pas forcément avec le même nom, ou pas en seul, etc. Donc ce n'est pas parce qu'un fichier référence des en tête que gcc va être capable de trouver les fichiers sources qui contiennent le code correspondant pour le compiler. C'est ce qui explique qu'il manque des symbole dans ta bibliothèque.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment