Xcode版本5.0.2,编译环境是OpenWRT SDK(mips-openwrt-linux-uclibc)。利用Xcoce的
“外部编译系统(External build system)”来实现在IDE中开发OpenWRT项目。
Xcode交叉编译配置
新项目和旧项目中都可以,在项目中创建目标“外部编译系统”(OS X – Other – External
Build System),选择使用编译工具为“/bin/make”。
没错,需要使用Makefile系统来实现交叉编译。也许cmake也是可行的,但不做讨论。所以
后文会给出一个简单的交叉编译Makefile教程。
这么做已经足够,但是Xcode的代码补全功能只对它支持的编译目标做处理,所以还需要
一点小技巧。
修复代码补全失效
方法来自于StackOverflow上的这个页面。基本思路是,创建一个普通的“命令行”
目标(OS X – Application – Command Line Tool),名字任意,在其编译文件列表中添加
所有的代码文件。这就强制Xcode解析所有的代码文件,从而启用代码完成功能。
快,糙,猛。
如果觉得新目标生成的几个文件比较烦人,还可以删除掉编译阶段中的“复制”阶段,然后就
可以清理好项目目录了。
Makefile编写
Xcode对外部编译系统的支持,实质上是通过Makefile实现的。只要在项目目录中写好了
Makefile文件,就可以像普通项目一样使用IDE了。
所以说,可以参考任何一篇Makefile教程来编写这个文件。要实现交叉编译,就需要编写
支持自订工具链的Makefile。
下面是一个Makefile文件的模板,它会编译目录下所有的c与cpp文件。可惜的是我找不到
它的来源了,下面的是经过我修改后可以用于OpenWRT SDK工具链的版本。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| SDK := /Volumes/OpenWrt/trunk/staging_dir
SDKBIN := $(SDK)/toolchain-mips_34kc_gcc-4.6-linaro_uClibc-0.9.33.2/bin
export STAGING_DIR := $(SDK)
export PATH := $(SDKBIN):$(SDK)/host/bin
AR := $(SDKBIN)/mips-openwrt-linux-uclibc-ar
AS := $(SDKBIN)/mips-openwrt-linux-uclibc-as
CC := $(SDKBIN)/mips-openwrt-linux-uclibc-gcc
CXX := $(SDKBIN)/mips-openwrt-linux-uclibc-g++
program_NAME := tubed
program_C_SRCS := $(wildcard *.c)
program_CXX_SRCS := $(wildcard *.cpp)
program_C_OBJS := ${program_C_SRCS:.c=.o}
program_CXX_OBJS := ${program_CXX_SRCS:.cpp=.o}
program_OBJS := $(program_C_OBJS) $(program_CXX_OBJS)
program_INCLUDE_DIRS :=
program_LIBRARY_DIRS :=
program_LIBRARIES :=
CFLAGS += -std=$(GCC_C_LANGUAGE_STANDARD)
CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))
LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))
LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library))
.PHONY: all clean distclean
all: $(program_NAME)
$(program_NAME): $(program_OBJS)
$(LINK.cc) $(program_OBJS) -o $(program_NAME)
clean:
@- $(RM) $(program_NAME)
@- $(RM) $(program_OBJS)
distclean: clean
define OBJECT_DEPENDS_ON_CORRESPONDING_HEADER
$(1) : ${1:.o=.h}
endef
$(foreach object_file,$(program_OBJS),$(eval $(call OBJECT_DEPENDS_ON_CORRESPONDING_HEADER,$(object_file))))
|
至此,Xcode下的交叉编译环境已经完成。