0

Je suis extrêmement novice en utilisant Makefiles et autoconf. J'utilise la bibliothèque d'images Camellia et j'essaie de lier statiquement mon code à leurs bibliothèques. Quand je lance "make" sur la bibliothèque d'images Camellia, j'obtiens les fichiers libCamellia.a, .so, .la, et .so.0.0.0 dans mon répertoire/usr/local/lib. Ceci est la commande que j'utilise pour compiler mon code avec leurs bibliothèques:configure.in: AM_DISABLE_SHARED ne change pas mon Makefile

gcc -L/usr/local/lib -lCamellia -o myprogram myprogram.c 

Cela fonctionne très bien, mais lorsque je tente de lier statiquement, voici ce que je reçois:

gcc -static -L/usr/local/lib -lCamellia -o myprogram myprogram.c 
/tmp/cck0pw70.o: In function `main': 
myprogram.c:(.text+0x23): undefined reference to `camLoadPGM' 
myprogram.c:(.text+0x55): undefined reference to `camAllocateImage' 
myprogram.c:(.text+0x97): undefined reference to `camZoom2x' 
myprogram.c:(.text+0x104): undefined reference to `camSavePGM' 
collect2: ld returned 1 exit status 

Je veux statiquement lien parce que j'essaie de modifier le code source de Camellia et je veux comparer ma version contre la leur. Donc, après quelques recherches, j'ai essayé d'ajouter AM_DISABLE_SHARED dans le fichier configure.in. Mais après avoir exécuté ./configure, j'obtiens toujours exactement le même Makefile. Après avoir "installé", j'ai toujours les mêmes résultats ci-dessus.

Quel est un moyen facile d'obtenir deux versions de mon code, l'une avec le code source original de Camellia compilé et l'autre avec ma version modifiée? Je pense que les bibliothèques statiques devraient fonctionner. Il existe un moyen facile de faire fonctionner les bibliothèques statiques ou existe-t-il d'autres solutions simples à mon problème? Je ne veux juste pas re-"faire" et re-"faire installer" chaque fois que je veux comparer ma version par rapport à l'original.

Répondre

1

Avez-vous réexécuté autoconf après avoir ajouté AM_DISABLE_SHARED et avant de configurer, faire, installer? Vous pouvez également utiliser configure --disable-dynamic pour l'arrêter en créant les bibliothèques partagées. Assurez-vous de supprimer tous ceux précédemment installés - make uninstall devrait le faire. Je ne vois rien d'autre qui ne va pas. Essayez d'être explicite:

gcc -static -o myprogram myprogram.c /usr/local/lib/libCamellia.a 

ou décomposer en deux étapes et vérifier les symboles myprogram.o sont ce que vous attendez avec nm myprogram.o.

+2

Pour les paquets qui utilisent libtool, c'est './configure --disable-shared', pas' --disable-dynamic'. –

1

Je ne suis pas habile avec autoconf et je ne sais pas pourquoi votre tentative de lien statiquement échoue, mais si la liaison fonctionne dynamiquement, je pense que l'utilisation de bibliothèques partagées résoudrait un peu mieux votre problème.

Créez simplement deux bibliothèques partagées, l'une avec le code Camellia d'origine et l'autre avec la version modifiée. Placez-les dans deux répertoires différents et lorsque vous exécutez myprogram, vous pouvez choisir entre eux en changeant LD_LIBRARY_PATH (ou ce que vous utilisez pour trouver des bibliothèques) ou en gardant un lien symbolique dans /usr/local/lib et en le basculant entre les bibliothèques. L'avantage de cette bibliothèque sur les bibliothèques statiques (en dehors du fait que cela fonctionne) est que vous pouvez bricoler avec votre code modifié, reconstruire la bibliothèque partagée et exécuter sans avoir à reconstruire myprogram (tant que vous ne modifiez pas les signatures).

P.S. Une expérience: essayez de supprimer les bibliothèques partagées de /usr/local/lib et de reconstruire sans l'indicateur -static, comme si vous utilisiez les bibliothèques partagées. En théorie, gcc devrait utiliser les bibliothèques statiques à la place. Les résultats peuvent donner une idée de l'échec du lien statique.