在Mac上使用makefile进行交叉编译

时间:2015-09-09 01:28:51

标签: ios macos makefile cross-compiling

我一直在编写一个需要为多个平台编译的makefile。现在我只需要为iOS编译,但是我已经知道我需要在不久的将来支持Mac OS X,我也一直在研究如何编译它。请注意,我没有使用Xcode。这不是一个选项,因为该项目还必须支持其他平台。

我已经为iPhone编译了makefile。它正在工作(甚至在模拟器上测试过),但我仍有一些疑问。

具体来说,我已经阅读了很多工具,现在我对其中一些工具感到有些困惑:

  • xcodebuild和clang 我得到了clang,它是一个编译器,但是xcodebuild怎么样?它只是使用clang进行编译并运行一些测试吗?使用有好处吗?缺点
  • libtool vs ar 几乎是一回事。这些有何不同? I've read之后应该调用运行lib(虽然为什么不清楚),所以必须有缺点,但是哪个?编辑:忘记在讨论中加入lipo

最后,我希望我不会偏离主题,我为iphoneos和iphonesimulator生成胖文件。这是怎么回事;首先我为每个平台编译:

ifeq ($(ARCH), iphoneos)
ARCHFLAGS = -arch armv7 -arch armv7s -arch arm64
else
ARCHFLAGS = -arch i386 -arch x86_64
endif

ifeq ($(ARCH), iphoneos)
VERFLAGS = -miphoneos-version-min=7.0
else
VERFLAGS = -mios-simulator-version-min=7.0
endif

CC = $(shell xcrun --sdk $(ARCH) --find clang)
CFLAGS := -isysroot $(shell xcrun --sdk $(ARCH) --show-sdk-path)
CFLAGS += $(ARCHFLAGS)

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
    $(CC) $(CFLAGS) -c $< -o $@

省略了一些标志,变量和规则。这会生成两组.o个文件。然后我使用ar(应该是libtool?):

AR = ar
ARFLAGS = crv

$(BINARY): $(OBJECTS) # This rule depends on the previous one
    $(AR) $(ARFLAGS) $(BINARY) $(OBJECTS)

到目前为止,每个平台都有一个静态库(.a)文件。我继续生成胖文件:

$(LIBTOOL) $(LIBTOOLFLAGS) -o $(call libfile,iphone,debug) $(call libfile,iphoneos,debug) $(call libfile,iphonesimulator,debug)

注意:libfile是一个返回给定配置文件名的函数。

现在有两个问题:

  1. 我是否可以跳过两个单独的.a文件的生成并通过指定ARCHFLAGS = -arch armv7 -arch armv7s -arch arm64 -arch i386 -arch x86_64跳转到fat文件?也就是说,一次通话中的所有平台。这是一回事吗?
  2. This是我最接近列出支持的架构(不是一个好的选择,我会说)。我可以只列出它们的所有(或子集),生成&#34;肥胖&#34; (lol)文件并期望编译器在与实际实现链接时优化文件的大小?或者是最终产品附带的胖文件?
  3. 感谢您阅读目前为止。 最好的。

0 个答案:

没有答案