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

Nic*_*ick 5 c iphone cocoa-touch gcc ios4

我正在尝试在iPhone项目中使用C库。我对iPhone开发非常满意。 我的图书馆

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

使用库的include配置和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 $@ $<
Run Code Online (Sandbox Code Playgroud)

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

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’
Run Code Online (Sandbox Code Playgroud)

我要解决所有这些错误吗?编辑makefile文件很傻吗?:)你们忍者忍者如何处理这种情况?一些研究使我相信我需要创建一个通用库...

谢谢!

idz*_*idz 2

问题是 /usr/include 中的包含文件适用于 Mac OS X,而不适用于 iPhone/iPad。如果你想让事情正常工作,你将必须添加(至少)Kay 在她的评论中提到的标志......

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

希望这可以帮助。

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

其他信息 2011 年 5 月 8 日

事实证明 Objective-C 包装器是针对 Mac OS X 而不是 iOS

要编译它,您需要执行以下操作:

获取新鲜来源:

svn co https://libircclient.svn.sourceforge.net/svnroot/libircclient libircclient
Run Code Online (Sandbox Code Playgroud)

切换到 libircclient/trunk/libircclient/src 目录并运行

./configure
Run Code Online (Sandbox Code Playgroud)

注意:这是一个有点肮脏的技巧。这实际上是针对 Mac OS X 的配置,但大多数情况下,事情都足够相似,足以使其工作。这会在 include 中生成一个名为 config.h 的文件。

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

将 libircclient/trunk/libircclient/src 中的文件 libircclient.c 添加到项目中。事实证明,该文件包含所有其他 C 文件。

打开项目设置并将 ../../include 添加到搜索标头路径。

建造并享受!