Déterminer si la bibliothèque C est installée sur Unix

Pour répondre à ma dernière question, y a-t-il un moyen simple de savoir si une bibliothèque C donnée est installée sur une machine donnée (pas de manière programmatique, juste comme une sorte d’absence)? Je dois utiliser libuuid, mais je ne suis pas sûr qu’il soit installé sur les machines en question. Les deux seules façons dont je peux penser sont:

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

2) Essayez quelque chose comme “man libuuid” bien que cela ne semble pas toujours être fiable si, pour une raison quelconque, les pages de manuel n’étaient pas installées.

Y a-t-il un meilleur autre moyen?

Avez-vous envisagé d’utiliser autoconf ? Il est conçu pour vérifier et voir si l’environnement de génération est configuré correctement.

Le moyen le plus simple est d’invoquer ld avec l’option -l . Cela permettra de tester l’existence de la bibliothèque, en recherchant automatiquement les emplacements de bibliothèque standard:

 $ ld -luuid ld: warning: cannot find entry symbol _start; not setting start address $ echo $? 0 $ ld -luuidblah ld: cannot find -luuidblah $ echo $? 1 # so... $ ld -luuid 2>/dev/null && echo "libuuid exists" || echo "libuuid not found" 

MODIFIER

Comme Dreamlax l’a souligné, cela ne fonctionne pas pour toutes les variantes Unix. Je ne sais pas si cela fonctionnera sur tous les Unix (j’ai testé Linux et OpenBSD) mais vous pouvez essayer ceci:

 $ echo "int main(){}" | gcc -o /dev/null -xc - -luuid 2>/dev/null $ echo $? 0 $ echo "int main(){}" | gcc -o /dev/null -xc - -luuidblah 2>/dev/null $ echo $? 1 

Voici ce que j’ai fait en utilisant autoconf , que je montre ici comme un exemple solide pour quiconque pourrait venir ensuite:

J’ai créé le fichier configure.ac qui contenait les éléments suivants:

 AC_INIT(package, 1.1, email) AC_CHECK_LIB(uuid, uuid_generate_random, [echo "libuuid exists"], [echo "libuuid missing"]) 

J’ai ensuite exécuté les commandes suivantes dans l’ordre (même dossier que j’ai fait configure.ac ):

 autoconf ./configure 

À la fin de la configuration, il spécifiait si oui ou non il avait trouvé uuid_generate_random dans la bibliothèque uuid . Semblait fonctionner parfaitement (bien que malheureusement, deux des systèmes d’exploitation manquaient la bibliothèque, mais c’est tout un autre problème).

Pour ceux qui trouveront cela après coup, les arguments AC_INIT sont des jetons et vous pouvez les copier en gros. Les arguments d’ AC_CHECK_LIB sont: nom de la bibliothèque, nom d’une fonction dans cette bibliothèque, que faire en cas de succès, que faire en cas d’échec.

Même si la réponse de Mehrdad n’était pas aussi utile que je l’aurais souhaité (c’est-à-dire de ne pas avoir passé du temps à traquer les docs), cela semble être le bon et je l’accepterai. mhawke: J’ai bien aimé votre réponse, mais je ne savais pas trop comment tester pour vérifier que cela fonctionnait. Il semblait sur SunOS, mais a toujours dit non sur les deux autres (AIX, HPUX) et je ne pouvais pas trouver une bibliothèque sur le dessus de ma tête que je pourrais garantir qu’il trouverait.

Merci pour l’aide les gars.

Les autotools, comme mentionné, vérifient les symboles dans les bibliothèques. La façon dont cela fonctionne est un peu simple. Comme vous le mentionnez en 1), autoconf et son résultat, le script de configuration, crée essentiellement un programme factice et tente d’établir un lien avec la bibliothèque en question. Si cela fonctionne, la bibliothèque fonctionne, si elle échoue, évidemment, cela ne fonctionnera pas. Autoconf recherche cependant des symboles / noms de fonctions spécifiques dans la bibliothèque.