【问题标题】:Cross-compile Autotools-based Libraries for Official iPhone SDK为官方 iPhone SDK 交叉编译基于 Autotools 的库
【发布时间】:2010-12-08 19:12:16
【问题描述】:

背景

我正在编写一个针对多种不同手机(包括 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”脚本?谢谢。

【问题讨论】:

    标签: iphone autotools cross-compiling gcc4


    【解决方案1】:

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

    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 特定测试的问题。我在链接上发布了followup question

    编辑

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

    【讨论】:

    • “为 iPhone 交叉编译 Apache Portable Runtime”链接已损坏。你有更新的链接吗?
    • 该页面已被删除。这是作者的explanation
    【解决方案2】:

    感谢您的脚本。它确实帮助了我很多。虽然我必须做一些更改,以便我构建的库的架构是 arm 而不是 i386

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-03-28
      • 2014-08-03
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-28
      • 2012-07-10
      • 1970-01-01
      相关资源
      最近更新 更多