[ld/C++] problème de librairis sur linux

bonjour,
Lors d'un link avec l'option "-static" j'ai l'erreur suivante:
In function 'machin' :: Using 'truc' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
le problème est que si je ne met pas le -static, il ne me trouve pas la librairie libg2c.so.0 (dans /usr/lib64)
Je voi 3 solutions à mon problème, mais je ne sais pas comment y arriver.
Le plus simple : dire à Linux ou se trouve "libg2c"
Reussir à compiler en static.
Ou plus malin, appliquer le static seulement à certaines lib (par exemple g2c en static, mais laisser "stdc++" en shared).
Dans les trois cas : Comment faire?
Merci de vos aides.
--
Salutation !
Char Snipeur

6 réponses

  1. Salut,

    Perso j'utilise sans problème le mix des 2 types de bibliothèques statiques et
    dynamiques (je fais rarement des bibliothèque dynamique).

    Faire une binaire statique nécessite de disposer toutes les bibliothèques en mode
    statique. Je ne vois pas comment tu peux t'en sortir autrement.

    Sinon ton problème en mode dynamique c'est à l'exécution ou à l'édition de lien ?

    A+, crabs
    0
    1. Contributeur
      Salut Crabs.
      le problème est à l'éxecution.
      la compilation/edition de lien ne pose pas de problème en non static.
      C'est pour ça que je voulais lié en static, pour éviter les problèmes de bib dynamique introuvable. Si je comprend bien ce que tu me dit, le "-static" ne passe pas car j'ai certaines bib qui n'existent pas en statique, c'est ça?

      Enfin, si quelqu'un pouvai me donner la signification du message d'erreur que j'ai.
      0
      1. Salut,

        Oui pour utiliser -static, toutes les bibliothèques doivent être statiques.
        Pour ton problème d'exécution, ajoute /usr/lib64 à la variable d'environnement
        LD_LIBRARY_PATH ou dans le fichier /etc/ld.so.conf
        Enfin ça me parait bizarre qu'il n'y soit pas, à moins que ton programme ne
        soit pas compilé en 64bits -- précise ta distribution, la version de ton noyau
        et son mode (32 ou 64bits) ainsi que la nature de ton CPU.

        Regardes les pages du manuel de ldd, ld.so et ldconfig.
        A+, crabs
        0
        1. Contributeur
          Salut.
          merci pour ta réponse, mais elle ne marche pas. On m'a déjà conseiller d'utiliser la variable LD_LIBRARY_PATH pour executer un programme ne trouvant pas un bib dyn. Mais chez moi ça ne fonctionne pas: déjà la variable n'est pas toujours existante, et quand elle existe elle ne contient même pas les répertoire habituels (/lib:/usr/lib)
          Linux: RedHat 2.6.9-5 avec 4 proc AMD opteron 64bits
          Le programme est compilé en 32bits. Mais j'avais compris que les proc 64 bits étaient compatible avec les "anciens" programme 32 et 16 bits.
          étant un PC de travail, je n'ai pas les droit root, donc pour modifier /etc/ld.so.conf ...
          0
          1. Salut,
            Effectivement, y a une compatibilité, mais il faut que ton programme soit
            compilé dans le même mode que tes bibliothèques dynamiques. Si tu disposes
            que des versions 64bits de certaines bibliothèques, tu ne pourra faire qu'un
            exécutable en 64bits.
            A+, crabs
            0
            1. Contributeur
              Salut,
              Merci Crabs.
              Je comprend mieux le propblème. Il faut que tout soit en 32 ou 64 bits, bib inclues, donc comme je n'ai qu'une version 64 de libg2c, je ne peux pas lancer le programme compiler en 32.
              La solution serai de compiler en 32, mais malheuresement, il y a une bib que je n'ai qu'en 32 (libsilo.a).
              j'ai donc deux solution : trouver libg2c en 32, ou libsilo en 64...
              J'espère que je m'en sortirai, et encore merci.
              0