iphone - procesador - dispositivos con arm
iPhone: ¿por qué el compilador no puede encontrar algunos al crear arquitectura ARM? (4)
Como Kay indicó en un comentario, si está intentando compilar desde la línea de comando (o mediante Make), debe especificar el -isysroot $(SDKROOT)
para obtener los encabezados correctos (de lo contrario, recuperará el host de Mac OS Encabezados X, que no necesariamente admiten ARM).
Lo más fácil es compilar con XCode, o buscar una versión de la biblioteca diseñada para compilar para iOS, pero si debe usar un sistema de compilación Make-driven existente, puede adaptarlo a la compilación para iOS configurando:
TARGETSDK = /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk
CC = xcrun -sdk $(TARGETSDK) gcc
CFLAGS = -arch armv7 -isysroot $(TARGETSDK) ...
Deberá usar comandos xcrun
similares para otras herramientas utilizadas en su compilación.
Estoy tratando de hacer uso de una biblioteca C en un proyecto de iPhone. Estoy muy verde con el desarrollo de iPhone. Mi biblioteca
He estado luchando durante días para intentar hacer que esta biblioteca se convierta en una biblioteca estática que pueda usar tanto para el simulador (i386) como para ARM7.
Usando la configuración de inclusión de la biblioteca y el archivo make, puedo construir la biblioteca sin problemas. Sin embargo, si edito el archivo MAKE para intentar construir esta misma biblioteca pero apuntar a la arquitectura de armv7, recibo muchos errores. Los errores parecen informar que algunos archivos de encabezado no se pueden ubicar.
Entonces, ¿el compilador intenta buscar en diferentes lugares los archivos de encabezado dependiendo de la arquitectura de destino?
Este es el archivo make que he editado para intentar construir para armv7:
# $Id: Makefile.in 62 2005-03-09 21:11:53Z gyunaev $
CC = /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-gcc-4.2.1
CFLAGS = -Wall -DIN_BUILDING_LIBIRC -O3 -DENABLE_THREADS -D_REENTRANT
AR=ar cr
RANLIB=ranlib
INCLUDES=-I../include
OBJS = libircclient.o
all: lib
lib: libircclient.a
install: lib
-mkdir /usr/local/include
-mkdir /usr/local/lib
cp ../include/libircclient.h /usr/local/include/libircclient.h
cp ../include/libirc_errors.h /usr/local/include/libirc_errors.h
cp ../include/libirc_events.h /usr/local/include/libirc_events.h
cp libircclient.a /usr/local/include/lib/libircclient.a
$(OBJS): utils.c dcc.c errors.c portable.c sockets.c colors.c
libircclient.a: $(OBJS)
$(AR) libircclient.a $(OBJS)
$(RANLIB) libircclient.a
clean:
rm -f libircclient.a $(OBJS)
distclean: clean
-rm -f Makefile
.c.o:
@echo "Compiling $<"
@$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $<
Aquí hay una muestra de los errores de compilación que estoy experimentando:
Compiling libircclient.c
In file included from /usr/include/sys/_types.h:33,
from /usr/include/_types.h:27,
from /usr/include/stdio.h:64,
from portable.c:18,
from libircclient.c:15:
/usr/include/machine/_types.h:36:24: error: arm/_types.h: No such file or directory
In file included from /usr/include/_types.h:27,
from /usr/include/stdio.h:64,
from portable.c:18,
from libircclient.c:15:
/usr/include/sys/_types.h:94: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__darwin_blkcnt_t’
/usr/include/sys/_types.h:95: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__darwin_blksize_t’
/usr/include/sys/_types.h:96: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘__darwin_dev_t’
¿Me estoy equivocando? Está editando el archivo make mudo? :) ¿Cómo pueden los ninjas unix manejar esta situación? Algunas investigaciones me han llevado a creer que necesito crear una biblioteca universal ...
¡Gracias!
Con Xcode 4.6, las cosas han cambiado un poco. Aquí está la secuencia de comandos que estoy usando convertir un código C a ASM para que pueda ver la salida de clang para armv7 (thumb2).
#!/bin/bash
DEVROOT=/Applications/Xcode.app/Contents/Developer
SDK=$DEVROOT/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.1.sdk
CLANG=$DEVROOT/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
$CLANG /
-x c -arch armv7 /
-std=gnu99 /
-Os /
-isysroot $SDK /
-S code.c -o code.s
Eche un vistazo a los archivos .s generados para ver la salida ARM ASM.
El problema es que el archivo de inclusión en / usr / include es para Mac OS X, no para iPhone / iPad. Si quieres que las cosas funcionen, deberás agregar (al menos) las banderas que Kay mencionó en su comentario ...
Una forma mucho más fácil de hacerlo es usar XCode. Simplemente cree un nuevo proyecto (elija la Biblioteca Estática Cocoa Touch) y agregue los archivos fuente. De acuerdo con el archivo Makefile, deberá agregar: utils.c dcc.c errors.c portable.c sockets.c colors.c
Espero que esto ayude.
También puede consultar IRCClient, que es un contenedor de Objective-C para la biblioteca que está utilizando. ¡No hay punto para reinventar la rueda!
INFORMACIÓN ADICIONAL 5/8/11
Resulta que el contenedor Objective-C está dirigido a Mac OS X no iOS
Esto es lo que debe hacer para compilar esto:
Obtenga las fuentes frescas:
svn co https://libircclient.svn.sourceforge.net/svnroot/libircclient libircclient
Cambie al directorio libircclient / trunk / libircclient / src y ejecútelo
./configure
Nota: este es un truco un poco sucio. Esto realmente se está configurando para Mac OS X, pero la mayoría de las veces las cosas son lo suficientemente similares para que esto funcione. Esto genera un archivo llamado config.h en incluir.
Encienda XCode y elija crear una nueva biblioteca estática Cocoa Touch. Cuando se le solicite cree un nuevo directorio libircclient / trunk / libircclient / iOS y guarde el nuevo proyecto allí.
Agregue el archivo libircclient.c de libircclient / trunk / libircclient / src al proyecto. Resulta que este archivo incluye todos los demás archivos C.
Abra la configuración de su proyecto y agregue ../../include a la ruta del encabezado de búsqueda.
¡Construye y disfruta!
He tenido cierto éxito al agregar lo siguiente a mi .bash_profile:
# OS SDK PATHS
IPHONE_SDK=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk
IPHONESIM_SDK=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk
MACOSX_SDK=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk
export IPHONE_SDK
export IPHONESIM_SDK
export MACOS_SDK
C_INCLUDE_PATH=$HOME/local/include:$IPHONE_SDK/usr/include:$IPHONESIM_SDK/usr/include
CPLUS_INCLUDE_PATH=$C_INCLUDE_PATH
export C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH
Esto da agrega todos los archivos de encabezado dependientes de la arquitectura a su carpeta de inclusión. Después de eso, pude compilar bibliotecas C ++ sin ninguna otra modificación.