2010-05-22 13 views
3

Je souhaite utiliser une bibliothèque Open Source. Comme je veux diffuser mon logiciel en tant que paquet binaire, je ne veux pas que la bibliothèque ait des dépendances sur d'autres bibliothèques, donc j'ai besoin de lier les dépendances de manière statique.Comment puis-je compiler un projet autotools avec des dépendances liées statiquement?

Maintenant que la bibliothèque est open source et qu'il n'y a pas de binaires fournis, je la compile moi-même. La bibliothèque utilise des autotools, et je n'ai trouvé aucune documentation utile sur la manière de lier les dépendances de manière statique. Ce que j'ai essayé, c'est d'appeler le script configure avec --enable-static, mais cela indique seulement à configure de compiler une version statique de la bibliothèque - mais j'ai besoin d'une bibliothèque dynamique qui inclut toutes les bibliothèques dont elle dépend. Donc, j'ai besoin d'un moyen de dire à configure de lier statiquement les dépendances, ou un moyen de post-traiter la bibliothèque construite pour inclure toutes les dépendances. Quelqu'un peut-il me dire comment faire cela?

Oh, et si c'est important: je suis sur 64bit Snow Leopard.

Répondre

2

Ayant récemment parcouru ce chemin moi-même, j'ai découvert que malheureusement les bibliothèques statiques ne fonctionnent pas de cette façon. Lorsque vous créez un binaire exécutable statique, l'éditeur de liens examine toutes les fonctions dont il a besoin, puis examine la liste des bibliothèques fournies et récupère le code correspondant à chaque fonction dont vous avez besoin. Lorsque vous produisez une bibliothèque statique, vous n'effectuez aucune liaison, donc tout votre code compilé est compressé (en fait, il utilise ar mais fonctionnellement c'est la même chose qu'un zip) dans une bibliothèque statique .a. (Le 'a' signifie 'archive'.) Parce qu'il n'y a pas d'étape de liaison, il n'y a rien qui examine quels appels de fonctions la bibliothèque utilise. Il a simplement un tas d '«externes non résolus» qui seront résolus plus tard. Cela signifie que lorsque vient le temps de lier votre binaire, vous devez fournir un code (bibliothèques) pour toutes les fonctions dont vous avez besoin - les fonctions que votre propre code utilise, et les fonctions utilisées par toutes les bibliothèques dont vous avez besoin.

Je peux absolument voir pourquoi vous voudriez produire une bibliothèque avec toutes vos dépendances, mais pour autant que je sache, ça ne marche pas comme ça. C'est pourquoi il existe des programmes comme pkg-config, que vous pouvez utiliser pour informer les utilisateurs de votre bibliothèque (statique ou dynamique) des bibliothèques dépendantes avec lesquelles ils doivent se connecter pour utiliser les vôtres.

Enfin, assurez-vous de vérifier la licence de la bibliothèque que vous souhaitez lier. Juste parce qu'une bibliothèque est open source, cela ne signifie pas que vous pouvez vous en tirer avec des liens. Si c'est une bibliothèque GPL, vous acceptez de publier votre propre code source sous la licence GPL, ce que vous ne voulez peut-être pas faire.

2

Si vous obtenez le fichier .a de la bibliothèque, vous pouvez essayer d'ajouter ce qui suit dans le fichier Makefile.am de votre projet.

yourproject_LDADD = libxxx.a 
+0

Eh bien merci d'avoir creusé cette vieille question, mais ce n'est pas une vraie réponse. Je veux vraiment avoir une DLL qui contient la bibliothèque et toutes ses dépendances. De plus, je n'utilise pas autotools moi-même. – flyx