2009-07-06 7 views

Odpowiedz

200

Innym rozwiązaniem jest lipo; jego wydajność jest krótka i czytelniejsza niż w przypadku otool.

Przykład:

% lipo -info /usr/lib/libiodbc.a 
Architectures in the fat file: /usr/lib/libiodbc.a are: x86_64 i386 ppc 
% lipo -info libnonfatarchive.a 
input file libnonfatarchive.a is not a fat file 
Non-fat file: libnonfatarchive.a is architecture: i386 
% 
+0

Właśnie to zweryfikowałem ze starym plikiem PJSIP .a. armv7. Dzięki. –

66

file prawdopodobnie Ci powie. otool z pewnością powinien być w stanie. Ale najpierw spróbuję file, np. , np.

logan:/Users/logan% file d2 
d2: Mach-O executable ppc 

Przykład z archiwum:

+28

W moim doświadczeniu 'file' często zawodzi. –

+4

Zobacz odpowiedź na temat lipo dalej, zawsze działa. –

+0

robota otoka, lipo działa, plik nie działa dla mnie –

49

Jak wspomniano wcześniej, file nie zawsze działa. otool -hv -arch all jest prawdopodobnie najbardziej zbliżoną rzeczą, która gwarantuje działanie - dostarcza informacji o architekturze dla każdego pliku pojedynczego obiektu w bibliotece.

przykład:

% otool -hv /sw/lib/libfftw3.a 
Archive : /sw/lib/libfftw3.a 
/sw/lib/libfftw3.a(align.o): 
Mach header 
     magic cputype cpusubtype caps filetype ncmds sizeofcmds  flags 
MH_MAGIC_64 X86_64  ALL 0x00  OBJECT  3  336 SUBSECTIONS_VIA_SYMBOLS 
/sw/lib/libfftw3.a(alloc.o): 
Mach header 
     magic cputype cpusubtype caps filetype ncmds sizeofcmds  flags 
MH_MAGIC_64 X86_64  ALL 0x00  OBJECT  3  416 SUBSECTIONS_VIA_SYMBOLS 
... 
+0

Po prostu, aby dodać do tej odpowiedzi, wolę otolka nad plikiem lub lipo.Próbowałem pliku, lipo i otool z biblioteką tłuszczu iOS, a otool jako jedyny pokazał mi, że zawiera pliki dla i386 (iPhone Simulator) oraz dla armv6, armv7 i armv7s (iPhone OS). – Roberto

+1

UWAGA: jeśli chcesz sprawdzić, czy twoja biblioteka jest gruba, czy nie, chcesz użyć "otool -arch all"; w przeciwnym razie zgłosi tylko jedną architekturę na plik .o. Szybki przegląd architektur w twoim .a, "otool -f" –

3

Jako alternatywa, Znalazłem objdump może działać dobrze. Na przykład w moim środowisku buduję archiwa biblioteki za pomocą vxWorks i muszę je połączyć z innymi projektami. Aby sprawdzić, czy archiwum jest poprawna architektura, mógłby zrobić coś podobnego następującej składni (bash):

if [ "$(objdumpsparc -a ${ARCHIVE_FILE} 2>&1 | ggrep -cvP 'elf32-sparc-vxworks')" -ne "0" ]; then 
    echo "Cannot build with ${ARCHIVE_FILE}, it contains one or more non-sparc components" 
fi; 

Ten przykład nie jest dokładnie poprawne, ponieważ niektóre linie pokazują się, że nie mówią elf32- sparc-vxworks, ale łatwo to zaadaptować.

Jedną z korzyści jest to, że objdump lub podobnie nazwany wariant jest zainstalowany na większości systemów operacyjnych * nix, podczas gdy narzędzia sugerowane w innych odpowiedziach nie są.

edycja Przyszło mi do głowy, że OP pytał o OSX. Przepraszam.

+0

Aby użyć 'objdump', możesz zainstalować GNU Binutils poprzez MacPorts. Aby zobaczyć wszystkie dostępne architektury, po prostu uruchom 'port search binutils'. Narzędzia do rozwoju natywnego są prefiksowane w celu uniknięcia konfliktów (np. 'Gobjdump' zamiast' objdump'). Możesz utworzyć alias dla wygody. –

+0

downvoter: czy mógłbyś zabrać się do konstruktywnej uwagi? –

1

Ten skrypt bash pomoże Ci programowo uzyskać listę architektur w zmiennej.

list_archs.sh: przykład

#! /bin/bash 
lipo -info $1 | sed -En -e 's/^(Non-|Architectures in the)fat file: .+(is architecture| are): (.*)$/\3/p' 

Zastosowanie:

./list_archs.sh /usr/lib/libc.dylib 
x86_64 i386 
Powiązane problemy