iPhone – 为什么编译器在构建ARM体系结构时找不到包含的内容?

我想在iPhone项目中使用C库。 iPhone开发我非常环保。 我的图书馆

我一直在努力争取将这个库构建到一个静态库中,我可以将它用于模拟器(i386)和ARM7。

使用库的include配置和makefile,我可以毫无问题地构建库。 但是,如果我编辑makefile来尝试构建同一个库但是以armv7架构为目标,我会遇到很多错误。 错误似乎是报告无法找到某些头文件。

那么编译器是否会尝试根据目标体系结构在不同的位置查找头文件?

这是我编辑的make文件,试图为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 .co: @echo "Compiling $<" @$(CC) $(CFLAGS) $(INCLUDES) -c -o $@ $< 

以下是我遇到的编译错误示例:

 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' 

我错了吗? 编辑makefile是不是很笨? :)你如何unix忍者处理这种情况? 一些研究让我相信我需要创建一个通用库……

谢谢!

问题是/ usr / include中的include文件适用于Mac OS X,而不适用于iPhone / iPad。 如果你想让事情发挥作用,你必须添加(至少)凯在评论中提到的标志……

简单的方法是使用XCode。 只需创建一个新项目(选择Cocoa Touch静态库)并添加源文件。 根据Makefile,您需要添加:utils.c dcc.c errors.c portable.c sockets.c colors.c

希望这可以帮助。

您还可以查看IRCClient ,它是您正在使用的库的Objective-C包装器。 没有必要重新发明轮子!

其他信息5/8/11

原来Objective-C包装器针对的是Mac OS X而不是iOS

以下是编译时需要做的事情:

获取新鲜的来源:

 svn co https://libircclient.svn.sourceforge.net/svnroot/libircclient libircclient 

转到libircclient / trunk / libircclient / src目录并运行

 ./configure 

注意:这是一个有点肮脏的技巧。 这实际上是为Mac OS X配置的,但大多数时候情况都相似,因此可以使用。 这会在include中生成一个名为config.h的文件。

启动XCode并选择创建新的Cocoa Touch静态库。 提示时创建一个新目录libircclient / trunk / libircclient / iOS并在那里保存新项目。

将文件libircclient.c从libircclient / trunk / libircclient / src添加到项目中。 事实certificate,此文件包含所有其他C文件。

打开项目设置并添加../../include到您的搜索标题路径。

建立和享受!

正如Kay在评论中指出的那样,如果您尝试使用命令行(或通过Make)进行构建,则必须指定-isysroot $(SDKROOT)标志以获取正确的标头(否则您将获取主机Mac OS) X标头,不一定支持ARM)。

最简单的方法是使用XCode构建,或者找到专为iOS构建的库版本,但是如果必须使用现有的Make-driven构建系统,则可以通过设置以适应iOS来构建它:

 TARGETSDK = /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk CC = xcrun -sdk $(TARGETSDK) gcc CFLAGS = -arch armv7 -isysroot $(TARGETSDK) ... 

您将需要对构建中使用的其他工具使用类似的xcrun命令。

我已经成功地将以下内容添加到我的.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 

这会将所有与体系结构相关的头文件添加到include文件夹中。 之后,我能够编译C ++库而无需任何其他修改。

使用Xcode 4.6,情况有所改变。 这是我使用将一些C代码转换为ASM的脚本,以便可以查看armv7(thumb2)的clang输出。

 #!/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 \ -xc -arch armv7 \ -std=gnu99 \ -Os \ -isysroot $SDK \ -S code.c -o code.s 

查看生成的.s以查看ARM ASM输出。