Réponses:
Une autre option est lipo
; sa sortie est brève et plus lisible que celle otool
de.
Un exemple:
% 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
%
file
vous le dira probablement. otool
devrait certainement être en mesure de le faire. Mais j'essaierais d' file
abord, par exemple
logan:/Users/logan% file d2
d2: Mach-O executable ppc
Exemple avec archive:
logan:/Users/logan% file /usr/lib/libMallocDebug.a
/usr/lib/libMallocDebug.a: Mach-O universal binary with 2 architectures
/usr/lib/libMallocDebug.a (for architecture i386): current ar archive random library
/usr/lib/libMallocDebug.a (for architecture ppc): current ar archive
file
échoue souvent.
Comme mentionné précédemment, file
ne fonctionne pas toujours. otool -hv -arch all
est probablement la chose la plus proche qui est garantie de fonctionner - il donne des informations d'architecture pour chaque fichier objet de la bibliothèque.
Exemple:
% otool -hv /sw/lib/libfftw3.a Archive: /sw/lib/libfftw3.a /sw/lib/libfftw3.a(align.o): Tête de Mach magic cputype cpusubtype caps filetype ncmds sizeofcmds flags MH_MAGIC_64 X86_64 TOUS 0x00 OBJET 3336 SUBSECTIONS_VIA_SYMBOLS /sw/lib/libfftw3.a(alloc.o): Tête de Mach magic cputype cpusubtype caps filetype ncmds sizeofcmds flags MH_MAGIC_64 X86_64 TOUS 0x00 OBJET 3416 SUBSECTIONS_VIA_SYMBOLS ...
Comme alternative, j'ai trouvé que objdump
cela fonctionnait bien. Par exemple, dans mon environnement, je construis des archives de bibliothèque avec vxWorks et je dois les lier à d'autres projets. Pour tester si l'archive est la bonne architecture, je pourrais faire quelque chose comme ce qui suit (syntaxe 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;
Cet exemple n'est pas exactement correct, car certaines lignes apparaissent qui ne disent pas elf32-sparc-vxworks, mais il est assez facile d'adapter cela.
Un avantage intéressant de ceci est que objdump
, ou une variante du même nom, est installée sur la plupart des systèmes d'exploitation * nix, alors que les outils suggérés dans d'autres réponses ne le sont pas.
edit Il m'est venu à l'esprit que l'OP demandait sur OSX. Mes excuses.
objdump
vous pouvez installer GNU Binutils via MacPorts. Pour voir toutes les architectures disponibles, exécutez simplement port search binutils
. Les outils de développement natif sont préfixés pour éviter les conflits (par exemple gobjdump
au lieu de objdump
). Vous pouvez créer un alias pour plus de commodité.
Ce script bash vous aidera à obtenir par programme une liste d'architectures dans une variable.
list_archs.sh:
#! /bin/bash
lipo -info $1 | sed -En -e 's/^(Non-|Architectures in the )fat file: .+( is architecture| are): (.*)$/\3/p'
Exemple d'utilisation:
./list_archs.sh /usr/lib/libc.dylib
x86_64 i386