问题描述
我正在编写一个针对几种不同手机的程序,包括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分别。
I am writing a program that targets several different phones, including the iPhone. The program depends on several thirdparty libraries. I am having difficulty cross-compiling these thirdparty libraries for the iPhone and iPhone simulator. The libraries include the Apache Portable Runtime and GNUTLS, as well as their dependencies. I would like the built libraries to end up in the prefixes "/opt/iphone-3.1", "/opt/iphone-3.0", "/opt/iphone-2.2.1", "/opt/iphone-simulator-3.1", and "/opt/iphone-simulator-3.0", respectively.
为了使交叉编译过程易于重复,我正在创建脚本来调用每个目标平台的配置脚本(iphone3.1-configure,iphone3.0-configure,iphone2.2.1-configure,iphonesim3.1-configure和iphonesim3.0-configure )。这是我遇到麻烦的地方。
In order to make the cross-compilation process easily repeatable, I am creating scripts to invoke the "configure" script for each of the target platforms ("iphone3.1-configure", "iphone3.0-configure", "iphone2.2.1-configure", "iphonesim3.1-configure", and "iphonesim3.0-configure"). This is where I am having trouble.
我正在使用Mac OS X 10.6 Snow Leopard计算机和官方Xcode 3.2 + iPhone SDK 3.1。
I am using a Mac OS X 10.6 Snow Leopard computer with the official Xcode 3.2 + iPhone SDK 3.1.
我目前有以下iphone3.1-configure脚本:
I currently have the following "iphone3.1-configure" script:
#! /bin/bash
#
# Program : iphone3.1-configure
# Author : Michael Aaron Safyan
# Synopsis :
# This program runs the "configure" script generated by the
# GNU Autotools in order to cross-compile thirdparty libraries
# for the iPhone 3.1 SDK. Run this script while in a directory
# containing an autotools "configure" script. Once run, this
# you can use "make" and "sudo make install" to build the library.
# An install prefix of "/opt/iphone-3.1/" is used.
#
unset CPATH
unset C_INCLUDE_PATH
unset CPLUS_INCLUDE_PATH
unset OBJC_INCLUDE_PATH
unset LIBS
unset DYLD_FALLBACK_LIBRARY_PATH
unset DYLD_FALLBACK_FRAMEWORK_PATH
export BUILD_DARWIN_VER=`uname -r`
export SDKVER="3.1"
export DEVROOT="/Developer/Platforms/iPhoneOS.platform/Developer"
export 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
export PREFIX="/opt/iphone-$SDKVER"
export AS="$DEVROOT/usr/bin/as"
export ASCPP="$DEVROOT/usr/bin/as"
export AR="$DEVROOT/usr/bin/ar"
export 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"
export CPP="$DEVROOT/usr/bin/cpp-4.2"
export CC="$DEVROOT/usr/bin/gcc-4.2"
export CXX="$DEVROOT/usr/bin/g++-4.2"
export LD="$DEVROOT/usr/bin/ld"
if [ ! \( -d "$DEVROOT" \) ] ; then
echo "The iPhone SDK could not be found. Folder \"$DEVROOT\" does not exist."
exit 1
fi
if [ ! \( -d "$SDKROOT" \) ] ; then
echo "The iPhone SDK could not be found. Folder \"$SDKROOT\" does not exist."
exit 1
fi
./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,我得到:
In the "apr-1.3.8" folder, I am running "iphone3.1-configure --disable-dso", and am getting:
checking build system type... i386-apple-darwin10.0.0
checking host system type... arm-apple-darwin9
checking target system type... arm-apple-darwin9
Configuring APR library
Platform: arm-apple-darwin9
checking for working mkdir -p... yes
APR Version: 1.3.8
checking for chosen layout... apr
checking for arm-apple-darwin9-gcc... /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... yes
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 accepts -g... yes
checking for /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 option to accept ISO C89... unsupported
Applying APR hints file rules for arm-apple-darwin9
adding "-DDARWIN" to CPPFLAGS
adding "-DSIGPROCMASK_SETS_THREAD_MASK" to CPPFLAGS
setting apr_posixsem_is_global to "yes"
setting ac_cv_func_kqueue to "no"
setting ac_cv_func_poll to "no"
(Default will be unix)
checking whether make sets $(MAKE)... yes
checking how to run the C preprocessor... /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2
configure: error: in `/Users/michaelsafyan/Downloads/apr-1.3.8':
configure: error: C preprocessor "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2" fails sanity check
See `config.log' for more details.
config.log的相关部分是:
The relevant part of "config.log" is:
configure:7710: checking how to run the C preprocessor
configure:7828: result: /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2
configure: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/include -isystem /opt/iphone-3.1/include -isystem /usr/local/iphone-3.1/include -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK conftest.c
cpp-4.2: error trying to exec 'cc1': execvp: No such file or directory
configure:7864: $? = 1
configure: failed program was:
| /* confdefs.h. */
| #define PACKAGE_NAME ""
| #define PACKAGE_TARNAME ""
| #define PACKAGE_VERSION ""
| #define PACKAGE_STRING ""
| #define PACKAGE_BUGREPORT ""
| /* end confdefs.h. */
| #ifdef __STDC__
| # include
| #else
| # include
| #endif
| Syntax error
configure: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/include -isystem /opt/iphone-3.1/include -isystem /usr/local/iphone-3.1/include -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK conftest.c
cpp-4.2: error trying to exec 'cc1': execvp: No such file or directory
configure:7864: $? = 1
configure: failed program was:
| /* confdefs.h. */
| #define PACKAGE_NAME ""
| #define PACKAGE_TARNAME ""
| #define PACKAGE_VERSION ""
| #define PACKAGE_STRING ""
| #define PACKAGE_BUGREPORT ""
| /* end confdefs.h. */
| #ifdef __STDC__
| # include
| #else
| # include
| #endif
| Syntax error
configure:7926: error: in `/Users/michaelsafyan/Downloads/apr-1.3.8':
configure:7929: error: C preprocessor "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp-4.2" fails sanity check
See `config.log' for more details.
问题
如何修复iphone3.1-configure脚本?谢谢。
Question
How do I fix the "iphone3.1-configure" script? Thanks.
推荐答案
好的。这仍然没有建立,但它进一步发展...
Ok. This still doesn't build, but it gets much further...
- C预处理器无法采用架构。
- C预处理器不接受--sysroot或-isystem(只使用'-I')。
- 使用cpp而不是cpp-4.2( 4.2版本是有缺陷的,因为它是预处理器,无论如何,使用哪个版本并不重要,所以你不妨使用那个有效的版本。)
iphone3.1配置脚本的更新版本是:
The updated version of the iphone3.1-configure script is:
#! /bin/bash
#
# Program : iphone3.1-configure
# Authors : Michael Aaron Safyan (michaelsafyan@gmail.com)
# Synopsis :
# This program runs the "configure" script generated by the
# GNU Autotools in order to cross-compile thirdparty libraries
# for the iPhone 3.1 SDK. Run this script while in a directory
# containing an autotools "configure" script. Once you run this,
# you can use "make" and "sudo make install" to build the library.
# An install prefix of "/opt/iphone-3.1/" is used.
#
unset CPATH
unset C_INCLUDE_PATH
unset CPLUS_INCLUDE_PATH
unset OBJC_INCLUDE_PATH
unset LIBS
unset DYLD_FALLBACK_LIBRARY_PATH
unset DYLD_FALLBACK_FRAMEWORK_PATH
export BUILD_DARWIN_VER=`uname -r`
export SDKVER="3.1"
export DEVROOT="/Developer/Platforms/iPhoneOS.platform/Developer"
export 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
export PREFIX="/opt/iphone-$SDKVER"
export AS="$DEVROOT/usr/bin/as"
export ASCPP="$DEVROOT/usr/bin/as"
export AR="$DEVROOT/usr/bin/ar"
export 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/include -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"
export CPP="$DEVROOT/usr/bin/cpp"
export CXXCPP="$DEVROOT/usr/bin/cpp"
export CC="$DEVROOT/usr/bin/gcc-4.2"
export CXX="$DEVROOT/usr/bin/g++-4.2"
export LD="$DEVROOT/usr/bin/ld"
export STRIP="$DEVROOT/usr/bin/strip"
if [ ! \( -d "$DEVROOT" \) ] ; then
echo "The iPhone SDK could not be found. Folder \"$DEVROOT\" does not exist."
exit 1
fi
if [ ! \( -d "$SDKROOT" \) ] ; then
echo "The iPhone SDK could not be found. Folder \"$SDKROOT\" does not exist."
exit 1
fi
./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=yes $@
此外,我正在调用--enable-threads --disable-dso,而不仅仅是--disable-dso。这仍然无效...它失败了:
Also, I am invoking with "--enable-threads --disable-dso", not just "--disable-dso". This still doesn't work... it is failing with:
checking for PTHREAD_PROCESS_SHARED in pthread.h... yes
checking for pthread_mutexattr_setpshared... yes
checking for working PROCESS_SHARED locks... configure: error: in `/Users/michaelsafyan/Downloads/apr-1.3.8':
configure: error: cannot run test program while cross compiling
See `config.log' for more details.
然而,这可能是APR特定测试的问题。我在链接上发布了。
However, this may be a problem with APR's specific tests. I am posting a followup question at the link.
我在交叉编译适用于iPhone的Apache Portable Runtime 。
这篇关于为官方iPhone SDK交叉编译基于Autotools的库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!