我正在尝试在iPhone项目中使用C库。我对iPhone开发非常满意。
My Library
我已经奋斗了几天,试图将这个库构建到一个静态库中,该库可以同时用于模拟器(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
.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文件是愚蠢的吗? :)你们忍者忍者如何处理这种情况?一些研究使我相信我需要创建一个通用库。
谢谢!
最佳答案
问题在于/usr/include中的include文件适用于Mac OS X,而不适用于iPhone/iPad。如果您想使事情正常进行,则必须添加(至少)凯在她的评论中提到的标志...
一个更简单的方法是使用XCode。只需创建一个新项目(选择Cocoa Touch静态库)并添加源文件即可。根据Makefile,您需要添加:utils.c dcc.c errors.c Portable.c sockets.c colors.c
希望这可以帮助。
您也可以 checkout 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添加到项目中。事实证明,此文件包括所有其他C文件。
打开项目设置,然后在搜索标题路径中添加../../include。
建立并享受!
关于iPhone-为什么在为ARM体系结构构建时编译器找不到某些包含项?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5878292/