5

背景

我正在编写一个针对几种不同手机的程序,包括 iPhone。该程序依赖于几个第三方库。我很难为 iPhone 和 iPhone 模拟器交叉编译这些第三方库。这些库包括 Apache Portable Runtime 和 GNUTLS,以及它们的依赖项。我希望构建的库以前缀“/opt/iphone-3.1”、“/opt/iphone-3.0”、“/opt/iphone-2.2.1”、“/opt/iphone-simulator-3.1”结尾”和“/opt/iphone-simulator-3.0”。

为了使交叉编译过程易于重复,我正在创建脚本来为每个目标平台调用“配置”脚本(“iphone3.1-configure”、“iphone3.0-configure”、“iphone2.2.1 -configure”、“iphonesim3.1-configure”和“iphonesim3.0-configure”)。这是我遇到麻烦的地方。

我正在使用带有官方 Xcode 3.2 + iPhone SDK 3.1 的 Mac OS X 10.6 Snow Leopard 计算机。

地位

我目前有以下“iphone3.1-configure”脚本:

#!/bin/bash

#
# 程序:iphone3.1-configure
# 作者 : Michael Aaron Safyan
# 简介:
# 这个程序运行由
# GNU Autotools 用于交叉编译第三方库
# 适用于 iPhone 3.1 SDK。在目录中运行此脚本
# 包含一个自动工具“配置”脚本。一旦运行,这
# 你可以使用“make”和“sudo make install”来构建库。
# 使用“/opt/iphone-3.1/”的安装前缀。
#

未设置 CPATH
取消设置 C_INCLUDE_PATH
取消设置 CPLUS_INCLUDE_PATH
取消设置 OBJC_INCLUDE_PATH
未设置的 LIBS
取消设置 DYLD_FALLBACK_LIBRARY_PATH
取消设置 DYLD_FALLBACK_FRAMEWORK_PATH

导出 BUILD_DARWIN_VER=`uname -r`
导出 SDKVER="3.1"
导出 DEVROOT="/Developer/Platforms/iPhoneOS.platform/Developer"
导出 SDKROOT="$DEVROOT/SDKs/iPhoneOS$SDKVER.sdk"
export PKG_CONFIG_PATH=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS$SDKVER.sdk/usr/lib/pkgconfig:/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/pkgconfig:/opt/iphone- $SDKVER/lib/pkgconfig:/usr/local/iphone-$SDKVER/lib/pkgconfig
出口前缀="/opt/iphone-$SDKVER"
导出 AS="$DEVROOT/usr/bin/as"
出口 ASPP="$DEVROOT/usr/bin/as"
出口 AR="$DEVROOT/usr/bin/ar"
出口 RANLIB="$DEVROOT/usr/bin/ranlib"
export CPPFLAGS="-std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='$SDKROOT' -isystem $SDKROOT/usr/include -isystem $DEVROOT/usr/include -isystem /opt/iphone- $SDKVER/include -isystem /usr/local/iphone-$SDKVER/include"
export CFLAGS="-std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='$SDKROOT' -isystem $SDKROOT/usr/include -isystem $DEVROOT/usr/include -isystem /opt/iphone- $SDKVER/include -isystem /usr/local/iphone-$SDKVER/include"
export CXXFLAGS="-std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='$SDKROOT' -isystem $SDKROOT/usr/include -isystem $DEVROOT/usr/include -isystem /opt/iphone- $SDKVER/include -isystem /usr/local/iphone-$SDKVER/include"
export LDFLAGS="-arch armv6 --sysroot='$SDKROOT' -L$SDKROOT/usr/lib -L$DEVROOT/usr/lib -L/opt/iphone-$SDKVER/lib -L/usr/local/iphone -$SDKVER/lib"
导出 CPP="$DEVROOT/usr/bin/cpp-4.2"
出口 CC="$DEVROOT/usr/bin/gcc-4.2"
导出 CXX="$DEVROOT/usr/bin/g++-4.2"
导出 LD="$DEVROOT/usr/bin/ld"

如果 [ !\( -d "$DEVROOT" \) ] ; 然后
   echo "找不到 iPhone SDK。文件夹 \"$DEVROOT\" 不存在。"
   1号出口
菲

如果 [ !\( -d "$SDKROOT" \) ] ; 然后
   echo "找不到 iPhone SDK。文件夹 \"$SDKROOT\" 不存在。"
   1号出口
菲

./configure --prefix="$PREFIX" --build="i386-apple-darwin$BUILD_DARWIN_VER" --host="arm-apple-darwin9" --enable-static --disable-shared $@

在“apr-1.3.8”文件夹中,我正在运行“iphone3.1-configure --disable-dso”,并且得到:

检查构建系统类型... i386-apple-darwin10.0.0
检查主机系统类型... arm-apple-darwin9
检查目标系统类型... arm-apple-darwin9
配置 APR 库
平台:arm-apple-darwin9
检查工作 mkdir -p... 是
4 月版本:1.3.8
检查选择的布局... apr
检查 arm-apple-darwin9-gcc ... /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2
检查 C 编译器默认输出文件名... a.out
检查 C 编译器是否工作......是的
检查我们是否在交叉编译...是的
检查可执行文件的后缀...
检查目标文件的后缀... o
检查我们是否正在使用 GNU C 编译器...是的
检查 /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 是否接受 -g... 是
检查 /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 选项以接受 ISO C89... 不支持
为 arm-apple-darwin9 应用 APR 提示文件规则
  将“-DDARWIN”添加到 CPPFLAGS
  将“-DSIGPROCMASK_SETS_THREAD_MASK”添加到 CPPFLAGS
  将 apr_posixsem_is_global 设置为“是”
  将 ac_cv_func_kqueue 设置为“否”
  将 ac_cv_func_poll 设置为“否”
(默认为 unix)
检查 make 是否设置 $(MAKE)... 是
检查如何运行 C 预处理器... /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2
配置:错误:在`/Users/michaelsafyan/Downloads/apr-1.3.8'中:
配置:错误:C 预处理器“/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2”未通过完整性检查
更多细节见“config.log”。

“config.log”的相关部分是:

配置:7710:检查如何运行 C 预处理器
配置:7828:结果:/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2
配置:7857:/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2 -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='/Developer/Platforms/iPhoneOS.platform /Developer/SDKs/iPhoneOS3.1.sdk' -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/包括 -isystem /opt/iphone-3.1/include -isystem /usr/local/iphone-3.1/include -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK conftest.c
cpp-4.2:尝试执行“cc1”时出错:execvp:没有这样的文件或目录
配置:7864:$?= 1
配置:失败的程序是:
| /* confdefs.h。*/
| #define PACKAGE_NAME ""
| #define PACKAGE_TARNAME ""
| #define PACKAGE_VERSION ""
| #define PACKAGE_STRING ""
| #define PACKAGE_BUGREPORT ""
| /* 结束 confdefs.h。*/
| #ifdef __STDC__
| # 包括
| #别的
| # 包括
| #万一
| 语法错误
配置:7857:/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2 -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='/Developer/Platforms/iPhoneOS.platform /Developer/SDKs/iPhoneOS3.1.sdk' -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.1.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/包括 -isystem /opt/iphone-3.1/include -isystem /usr/local/iphone-3.1/include -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK conftest.c
cpp-4.2:尝试执行“cc1”时出错:execvp:没有这样的文件或目录
配置:7864:$?= 1
配置:失败的程序是:
| /* confdefs.h。*/
| #define PACKAGE_NAME ""
| #define PACKAGE_TARNAME ""
| #define PACKAGE_VERSION ""
| #define PACKAGE_STRING ""
| #define PACKAGE_BUGREPORT ""
| /* 结束 confdefs.h。*/
| #ifdef __STDC__
| # 包括
| #别的
| # 包括
| #万一
| 语法错误
配置:7926:错误:在`/Users/michaelsafyan/Downloads/apr-1.3.8'中:
配置:7929:错误:C 预处理器“/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2”未通过完整性检查
更多细节见“config.log”。

问题

如何修复“iphone3.1-configure”脚本?谢谢。

4

2 回答 2

3

好的。这仍然没有建立,但它更进一步......

  1. C 预处理器不能采用体系结构。
  2. C 预处理器不接受--sysroot 或-isystem(只使用'-I')。
  3. 使用“cpp”而不是“cpp-4.2”(4.2版本是有缺陷的,而且由于它是预处理器,所以不管你使用哪个版本,所以你最好使用那个可以工作的版本。)

iphone3.1-configure脚本的更新版本为:

#!/bin/bash

#
# 程序:iphone3.1-configure
# 作者:Michael Aaron Safyan (michaelsafyan@gmail.com)
# 简介:
# 这个程序运行由
# GNU Autotools 用于交叉编译第三方库
# 适用于 iPhone 3.1 SDK。在目录中运行此脚本
# 包含一个自动工具“配置”脚本。一旦你运行这个,
# 你可以使用“make”和“sudo make install”来构建库。
# 使用“/opt/iphone-3.1/”的安装前缀。
#

未设置 CPATH
取消设置 C_INCLUDE_PATH
取消设置 CPLUS_INCLUDE_PATH
取消设置 OBJC_INCLUDE_PATH
未设置的 LIBS
取消设置 DYLD_FALLBACK_LIBRARY_PATH
取消设置 DYLD_FALLBACK_FRAMEWORK_PATH

导出 BUILD_DARWIN_VER=`uname -r`
导出 SDKVER="3.1"
导出 DEVROOT="/Developer/Platforms/iPhoneOS.platform/Developer"
导出 SDKROOT="$DEVROOT/SDKs/iPhoneOS$SDKVER.sdk"
export PKG_CONFIG_PATH=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS$SDKVER.sdk/usr/lib/pkgconfig:/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/pkgconfig:/opt/iphone- $SDKVER/lib/pkgconfig:/usr/local/iphone-$SDKVER/lib/pkgconfig
出口前缀="/opt/iphone-$SDKVER"
导出 AS="$DEVROOT/usr/bin/as"
出口 ASPP="$DEVROOT/usr/bin/as"
出口 AR="$DEVROOT/usr/bin/ar"
出口 RANLIB="$DEVROOT/usr/bin/ranlib"
export CPPFLAGS="-pipe -no-cpp-precomp -I$SDKROOT/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -I$SDKROOT/usr/include -I$DEVROOT/usr/包括 -I/opt/iphone-$SDKVER/include -I/usr/local/iphone-$SDKVER/include"
export CFLAGS="-std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='$SDKROOT' -isystem $SDKROOT/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem $SDKROOT/usr/include -isystem $DEVROOT/usr/include -isystem /opt/iphone-$SDKVER/include -isystem /usr/local/iphone-$SDKVER/include"
export CXXFLAGS="-std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='$SDKROOT' -isystem $SDKROOT/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem $SDKROOT/usr/include -isystem $DEVROOT/usr/include -isystem /opt/iphone-$SDKVER/include -isystem /usr/local/iphone-$SDKVER/include"
export LDFLAGS="-arch armv6 --sysroot='$SDKROOT' -L$SDKROOT/usr/lib -L$DEVROOT/usr/lib -L/opt/iphone-$SDKVER/lib -L/usr/local/iphone -$SDKVER/lib"
导出 CPP="$DEVROOT/usr/bin/cpp"
导出 CXXCPP="$DEVROOT/usr/bin/cpp"
出口 CC="$DEVROOT/usr/bin/gcc-4.2"
导出 CXX="$DEVROOT/usr/bin/g++-4.2"
导出 LD="$DEVROOT/usr/bin/ld"
导出 STRIP="$DEVROOT/usr/bin/strip"

如果 [ !\( -d "$DEVROOT" \) ] ; 然后
   echo "找不到 iPhone SDK。文件夹 \"$DEVROOT\" 不存在。"
   1号出口
菲

如果 [ !\( -d "$SDKROOT" \) ] ; 然后
   echo "找不到 iPhone SDK。文件夹 \"$SDKROOT\" 不存在。"
   1号出口
菲

./configure --prefix="$PREFIX" --build="i386-apple-darwin$BUILD_DARWIN_VER" --host="arm-apple-darwin9" --enable-static --disable-shared ac_cv_file__dev_zero=no ac_cv_func_setpgrp_void=是 $@

另外,我正在调用“--enable-threads --disable-dso”,而不仅仅是“--disable-dso”。这仍然不起作用......它失败了:

检查 pthread.h 中的 PTHREAD_PROCESS_SHARED ... 是
检查 pthread_mutexattr_setpshared... 是
检查工作的 PROCESS_SHARED 锁...配置:错误:在“/Users/michaelsafyan/Downloads/apr-1.3.8”中:
配置:错误:交叉编译时无法运行测试程序
更多细节见“config.log”。

但是,这可能是 APR 特定测试的问题。我在链接上发布了一个后续问题

编辑

我在Cross-compiling the Apache Portable Runtime for iPhone中提供了一个更完整的解决方案。

于 2009-10-22T00:18:00.363 回答
1

谢谢你的剧本。它确实帮助了我很多。虽然我不得不做一些改变,以便我构建的库的体系结构是arm而不是i386.

首先,我必须更改编译器:

# export CC="$DEVROOT/usr/bin/gcc-4.2"
export CC="$DEVROOT/usr/bin/arm-apple-darwin10-gcc-4.2.1"

然后我删除了这个-arch armv6选项,因为这个编译器不理解它,从CFLAGS, CXXFLAGS, LDFLAGS

更新了 SDKVER 和 gcc 版本,它工作了!

于 2010-10-08T08:49:42.967 回答