2009-09-03 17 views
6

Jako pytanie uzupełniające do mojego last one, istnieje prosty sposób sprawdzenia, czy dana biblioteka C jest zainstalowana na danym komputerze (nie programowo, tak jak coś jednorazowego)? Muszę używać libuuid, ale nie jestem pewien, czy jest zainstalowany na tych maszynach. Jedyne dwa sposoby mogę myśleć to:Ustal, czy biblioteka C jest zainstalowana na systemie Unix

1) Spróbuj skompilować tam kod (więcej pracy niż chciałbym zrobić)

2) Spróbuj coś jak „człowiek libuuid”, choć wydaje się to nie zawsze byłby niezawodny, gdyby z jakiegoś powodu strony podręcznika nie zostały zainstalowane.

Czy jest jakiś lepszy sposób?

Odpowiedz

9

Czy rozważałeś użycie autoconf? Został zaprojektowany w celu sprawdzenia, czy środowisko kompilacji jest poprawnie skonfigurowane.

+0

Niezbyt dobrze się z tym zapoznałem, a patrząc na argumenty polecenia, nie jestem pewien, w jaki sposób pomaga mi rozwiązać mój problem. Dodatkowe informacje z pewnością zostaną docenione. – Morinar

+0

Zobacz dokumentację, z którą się łączyłem. Twój problem jest podstawowym przypadkiem użycia 'autoconf'. 'autoconf' pobiera plik' configure.ac' i wypisuje skrypt powłoki 'configure'. –

+0

@Morinar - Korzystanie z autoconf i automake nie jest intuicyjne i na pierwszy rzut oka niejasne, możesz poczuć się jak uderzanie głową o ścianę i/lub pisanie własnego narzędzia do automatycznej konfiguracji, ale po pewnym czasie dowiesz się, jak działają . Jako ktoś, kto niedawno musiał przejść przez ten proces, zapewniam cię, że jest to najlepszy sposób na zrobienie tego rodzaju rzeczy. –

0

Autotools, jak wspomniano, sprawdza symbole w bibliotekach. Sposób, w jaki to robi jest nieco prosty. Jak wspomniano w 1), autoconf i jego wynik skryptu configure, w zasadzie tworzy fikcyjny program c i próbuje połączyć się z biblioteką, o której mowa. Jeśli to działa, biblioteka działa, jeśli się nie powiedzie, oczywiście nie będzie działać. Autoconf szuka jednak konkretnych nazw symboli/funkcji w bibliotece.

+0

To, co robi autoconf, jest sensowne: nie szukasz jedynie konkretnego pliku (biblioteki) - szukasz określonej funkcji, która normalnie znajduje się w tej bibliotece. Każdy może stworzyć bibliotekę o nazwie libuuid.so (libuuid.a); jeśli biblioteka nie zawiera funkcji, której szukasz, ta biblioteka nie jest w żaden sposób pomocna. –

6

Najprostszym sposobem jest wywołanie ld za pomocą opcji -l. To skutecznie przetestować istnienie biblioteki, szukając standardowe lokalizacje biblioteki automatycznie:

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

EDIT

Jak dreamlax zauważył, to nie działa dla wszystkich wariantów Uniksa. Nie wiem, czy to będzie działać na wszystkich Uniksach (Przetestowałem Linux i OpenBSD), ale można spróbować to zamiast:

$ 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 
+1

To nie jest zgodne. Na moim Macu 'ld' zwraca 1 w obu przypadkach. – dreamlax

+0

@dreamlax: to wstyd. Nadal powinno być możliwe podjęcie decyzji, patrząc na stderr polecenia, i nie może to stanowić problemu dla OP, biorąc pod uwagę, że jego celami unix są AIX, Sun i HP (wymienione w poprzednim pytaniu). – mhawke

+0

Twoje drugie rozwiązanie (również system OS X) cierpi z powodu tego samego problemu. Nazwałbym to błędem "ld" OS X, ale nadal jest problem. –

2

Oto co zrobiłem używając autoconf, co mam pokazano tutaj jako stałe przykładem kto jeszcze może się przez następne:

utworzonego plik configure.ac który miał następujący skład:

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

następnie ran następujące polecenia w kolejności (sam folder że wykonany configure.ac)

autoconf 
./configure 

Pod koniec configure, że wypluł z powrotem, czy też nie znalazł uuid_generate_random w bibliotece uuid. Wydawało się, że działa doskonale (chociaż niestety, dwa systemy operacyjne nie miały biblioteki, ale to zupełnie inny problem).

Dla każdego, kto może znaleźć to po fakcie, argumenty AC_INIT tutaj są wygrane i można je skopiować hurtowo. Argumentami dla AC_CHECK_LIB są: nazwa biblioteki, nazwa funkcji w tej bibliotece, co zrobić z sukcesem, co zrobić w przypadku niepowodzenia.

Mimo że odpowiedź Mehrdada nie była tak pomocna, jak bym chciał (tj. Nie spędzał czasu na trollingu dokumentów), wydaje się, że jest poprawny i zaakceptuję to. mhawke: Naprawdę podobała mi się twoja odpowiedź, ale nie bardzo wiedziałem, jak przetestować, żeby się upewnić, że to zadziałało.Wydawało się to na SunOS, ale zawsze odmawiał dwóch pozostałych (AIX, HPUX) i nie mogłem wymyślić biblioteki z mojej głowy, którą mogłem zagwarantować, że ją znajdzie.

Dzięki za pomoc chłopaki.

Powiązane problemy