iPhone - 为什么编译器在为 ARM 架构构建时找不到某些包含?

标签 iphone c cocoa-touch ios4 gcc

我正在尝试在 iPhone 项目中使用 C 库。我对 iPhone 开发非常陌生。 My Library

我已经奋斗了几天,试图将这个库构建成一个静态库,我可以将它用于模拟器 (i386) 和 ARM7。

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

那么编译器会根据目标架构尝试在不同的地方寻找头文件吗?

这是我为 armv7 尝试构建而编辑的 make 文件:

 # $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 $@ $<

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

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 中的包含文件是针对 Mac OS X 的,而不是针对 iPhone/iPad 的。如果你想让事情正常进行,你必须(至少)添加 Kay 在她的评论中提到的标志......

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

希望这对您有所帮助。

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

附加信息 2011 年 5 月 8 日

原来 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/trunk/libircclient/src 中的 libircclient.c 文件添加到项目中。事实证明,该文件包含所有其他 C 文件。

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

构建并享受!

关于iPhone - 为什么编译器在为 ARM 架构构建时找不到某些包含?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5878292/

相关文章:

ios - AirPlay 镜像的欠扫描问题

iphone - Objective-C——在 Cocoa-Touch 中处理触摸事件的选项

iphone - Objective C (iphone) 关于发布的问题

iphone - HTTP 自适应比特率流式传输如何在 iPhone 上工作?

C 预处理器为多种类型赋值

ios - Caches 目录的向后兼容性

ios - 上传应用到AppStore,只允许登录

c - c 中的指针- "is a pointer; did you mean to use ' ->'?"

c++ - 当我们调用 C 函数时,为什么不抛出编译器时间错误

ios - SplitViewcontroller 以编程方式隐藏主视图