Frage Stellen Sie fest, ob die C-Bibliothek unter Unix installiert ist


Als Folgefrage an meine LetzterGibt es einen einfachen Weg zu sagen, ob eine bestimmte C-Bibliothek auf einer bestimmten Maschine installiert ist (nicht programmatisch, nur als einmaliges Ding)? Ich muss libuuid verwenden, aber ich bin nicht sicher, ob es auf den fraglichen Maschinen installiert ist. Die einzigen zwei Möglichkeiten, die ich mir vorstellen kann, sind:

1) Versuchen Sie den Code dort zu kompilieren (mehr Arbeit als ich tun möchte)

2) Versuchen Sie etwas wie "man libuuid", obwohl es scheint, dass dies nicht immer zuverlässig wäre, wenn die Manpages aus irgendeinem Grund nicht installiert werden.

Gibt es einen besseren anderen Weg?


6
2017-09-03 21:58


Ursprung


Antworten:


Hast du überlegt mit zu verwenden? autoconf? Es wurde entwickelt, um zu überprüfen, ob die Build-Umgebung korrekt eingerichtet wurde.


9
2017-09-03 22:04



Der einfachste Weg ist das Aufrufen ld mit dem -l Möglichkeit. Dies wird effektiv die Existenz der Bibliothek testen und die Standardbibliotheksspeicherorte automatisch durchsuchen:

$ 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"

BEARBEITEN

Wie dreamlax darauf hingewiesen hat, funktioniert dies nicht für alle Unix-Varianten. Ich weiß nicht, ob es auf allen Unixen funktioniert (ich habe Linux und OpenBSD getestet), aber du kannst es stattdessen versuchen:

$ 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

7
2017-09-04 01:25



Hier ist, was ich benutzt habe autoconf, die ich hier als ein solides Beispiel für denjenigen zeige, der als nächstes kommen könnte:

Ich habe die Datei erstellt configure.ac welches folgendes enthielt:

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

Ich habe dann die folgenden Befehle der Reihe nach ausgeführt (denselben Ordner, den ich gemacht habe) configure.ac):

autoconf
./configure

Am Ende der Konfiguration spuckte es zurück, ob es gefunden wurde oder nicht uuid_generate_random in dem uuid Bibliothek. Schien perfekt zu funktionieren (obwohl leider zwei der Betriebssysteme die Bibliothek fehlten, aber das ist ein ganz anderes Problem).

Für jeden, der dies nach der Tat finden kann, die AC_INIT Argumente hier sind Throwaways und Sie können sie groß kopieren. Die Argumente zu AC_CHECK_LIB sind: Bibliotheksname, der Name einer Funktion in dieser Bibliothek, was bei Erfolg zu tun ist, was bei einem Fehler zu tun ist.

Obwohl Mehrdads Antwort nicht ganz so hilfreich war, wie ich es mir gewünscht hätte (d. H. Keine Zeit damit verbracht, die Dokumente zu trollen), scheint es die richtige zu sein und ich akzeptiere sie. mhawke: Ich habe deine Antwort sehr gemocht, aber ich war mir nicht ganz sicher, wie ich testen sollte, um sicherzustellen, dass es funktioniert. Es schien auf SunOS, aber sagte immer nein zu den anderen zwei (AIX, HPUX) und ich konnte nicht scheinen, um eine Bibliothek aus der Spitze meines Kopfes zu finden, ich könnte garantieren, dass es finden würde.

Danke für die Hilfe Jungs.


2
2017-09-04 14:37



Die Autotools, wie erwähnt, sucht nach Symbolen in Bibliotheken. Die Art und Weise, wie es gemacht wird, ist etwas einfach. Wie Sie in 1) erwähnen, erstellt autoconf und sein Ergebnis, das configure-Skript, im Grunde ein Dummy-c-Programm und versucht, eine Verbindung mit der betreffenden Bibliothek herzustellen. Wenn es funktioniert, funktioniert die Bibliothek, wenn es fehlschlägt, wird es offensichtlich nicht funktionieren. Autoconf sucht jedoch nach bestimmten Symbolen / Funktionsnamen in der Bibliothek.


0
2017-09-03 22:10