6
votes

Déterminez si la bibliothèque C est installée sur UNIX

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:

1) Essayez de compiler le code là-bas (plus de travail que je voudrais faire)

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.

Y a-t-il une meilleure meilleure façon?


0 commentaires

4 Réponses :


9
votes

6 commentaires

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 . AutoConf prendra un fichier configurer.ac fichier et sortie A configure le script shell .


@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 ? Évidemment, vous ne pouvez pas expliquer autoconf 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.



0
votes

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.


1 commentaires

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.



7
votes

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


6 commentaires

Ce n'est pas cohérent. Sur mon Mac, ld 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 , 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 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 à LD / GCC. Mais vous devez toujours savoir où sont ces endroits non standard. GCC -PRINT-Search-DirS signalera la recherche des chemins de la bibliothèque et peut-être qu'une solution peut être conçue en utilisant cela.



2
votes

Voici ce que j'ai utilisé avec Autoconf code>, que je montrent ici comme un exemple solide pour quiconque pourrait arriver en suivant:

J'ai créé le fichier configure.ac Code> qui contenait les éléments suivants: p> xxx pré>

i puis a ensuite exécuté les commandes suivantes dans l'ordre (même dossier que j'ai formulé configure.ac code>): p >

autoconf
./configure


0 commentaires