comme une question de suivi à mon Dernier , y a-t-il Un moyen simple de dire si une bibliothèque C donnée est installée sur une machine donnée (pas de manière programmatique, tout comme une chose unique)? J'ai besoin d'utiliser libruduid, mais je ne sais pas si c'est installé sur les machines en question. Les deux principales façons de penser sont: p>
1) Essayez de compiler le code là-bas (plus de travail que je voudrais faire) P>
2) Essayez quelque chose comme "l'homme libuuid" bien que semble que cela ne serait pas toujours fiable si, pour une raison quelconque, les Mangages ne sont pas installés. P>
Y a-t-il une meilleure meilleure façon? P>
4 Réponses :
Avez-vous envisagé d'utiliser autoconf code> une>? Il est conçu pour vérifier et voir si l'environnement de construction est configuré correctement. P>
Pas vraiment le familier du tout et de regarder les arguments de commandement, je ne suis pas vraiment sûr de savoir comment cela m'aidait à résoudre mon problème. Des informations supplémentaires seraient définitivement appréciées.
Regardez la documentation que j'ai liée à. Votre problème est le cas d'utilisation de base pour autoconf code>.
AutoConf CODE> prendra un fichier
configurer.ac code> fichier et sortie A
configure le script shell code>.
@Morinar - Utiliser AutoConf et AutoConf ne sont pas intuitifs et ne sont pas clairs au début, et vous pouvez avoir envie de vous battre la tête contre un mur et / ou d'écrire votre propre outil de configuration automatique, mais après un certain temps, vous trouverez comment ils fonctionnent. En tant que personne qui a récemment dû traverser ce processus, je vous assure que c'est la meilleure façon de faire ce genre de chose.
@Chris Lutz, c'est le meilleur moyen, mais malheureusement, c'est toujours une voie horrible.
@Deamlax - aucun argument là-bas. @Mehrdad - Peut-être votre réponse serait peut-être améliorée si vous avez posté un échantillon montrant comment utiliser autoconf code>? Évidemment, vous ne pouvez pas expliquer
autoconf code> dans une seule réponse Stackoverflow, mais vous pourriez au moins le faire démarrer.
Chris: Je suis d'accord mais je ne pense pas que je sois capable de décrire cela mieux que la documentation, d'autant plus que je ne sais pas quel est l'objectif réel. Je veux dire, je n'ai aucune idée de ce que l'OP veut faire si la bibliothèque était indisponible.
Les autotools, comme mentionné, vérifie les symboles dans les bibliothèques. La façon dont il fait est un peu simple. Comme vous le mentionnez dans 1), AutoConf et son résultat, le script de configuration crée essentiellement un programme mannequin C et tente de relier la bibliothèque en question. Si cela fonctionne, la bibliothèque fonctionne, si elle échoue, évidemment, elle ne fonctionnera pas. AutoConf recherche des symboles spécifiques / noms de fonction dans la bibliothèque. P>
Qu'est-ce que Autoconf est sensible: vous ne recherchez pas simplement un fichier (bibliothèque) particulier - vous recherchez une fonction particulière que l'on trouve normalement dans cette bibliothèque. Tout le monde peut créer une bibliothèque appelée libuuid.so (libuuid.a); Si la bibliothèque ne contient pas la fonction que vous recherchez, cette bibliothèque ne vous aide pas.
Le moyen le plus simple est d'invoquer ld code> avec l'option
-l code>. Cela testera efficacement l'existence de la bibliothèque, la recherche automatique des emplacements de la bibliothèque standard:
$ echo "int main(){}" | gcc -o /dev/null -x c - -luuid 2>/dev/null
$ echo $?
0
$ echo "int main(){}" | gcc -o /dev/null -x c - -luuidblah 2>/dev/null
$ echo $?
1
Ce n'est pas cohérent. Sur mon Mac, ld code> retourne 1 dans les deux cas.
@DeMlax: C'est une honte. Devrait toujours être possible de décider en examinant le STDERR du commandement, ce qui peut ne pas être un problème pour l'OP étant donné que ses objectifs UNIX sont AIX, Sun et HP (mentionnés dans sa précédente question).
Votre deuxième solution (OS X ici aussi) souffre du même problème. J'appellerais cela la faute du ld code>, mais c'est toujours un problème.
Ou peut-être peut-être un problème avec le format Mach-o? Je ne connais pas vraiment assez de ces choses.
Qui vous dit si la bibliothèque est dans les endroits standard; Il ne vous dit pas si la bibliothèque est dans des endroits non standard. Et il n'est pas clair si cela fonctionne pour des endroits «semi-standard» comme / usr / local / lib.
Considérant les expériences des autres sur différentes plates-formes, il semble que ce n'est pas la bonne soluion. @Jonathan Leffler: Sans connaissances préalables, comment allez-vous la trouver dans des endroits non standard de toute façon? LD CODE> Par lui-même recherchera les annuaires standard, tout ce qui est défini dans la variable d'environnement LD_Library_Path ainsi que les chemins fournis par l'utilisateur spécifié dans l'option
-l code> à LD / GCC. Mais vous devez toujours savoir où sont ces endroits non standard.
GCC -PRINT-Search-DirS Code> signalera la recherche des chemins de la bibliothèque et peut-être qu'une solution peut être conçue en utilisant cela.
Voici ce que j'ai utilisé avec J'ai créé le fichier i puis a ensuite exécuté les commandes suivantes dans l'ordre (même dossier que j'ai formulé Autoconf code>, que je montrent ici comme un exemple solide pour quiconque pourrait arriver en suivant:
configure.ac Code> qui contenait les éléments suivants: p>
configure.ac code>): p >
autoconf
./configure