【问题标题】:Compiling libpq with iOS SDK 4.2使用 iOS SDK 4.2 编译 libpq
【发布时间】:2011-05-29 09:11:33
【问题描述】:

我正在尝试使用 iOS SDK 4.2 再次为 arm 和 i386 编译 libpq。

我去年为 SDK3.x 做过,没有任何问题。

现在,当我想用​​两个文件创建胖二进制文件时,我收到了这个错误:

specifed architecture type (arm) for file (/Users/montx/mylibs_sdk42/libpq.arm) does not match its cputype (7) and cpusubtype (3) (should be cputype (12) and cpusubtype (0))

我正在重新编译,因为我编译的文件不适用于最新的 iOS4.2

Detected an attempt to call a symbol in system libraries that is not present on the iPhone:
fcntl$UNIX2003 called from function pg_set_noblock in image GlobalScan.
If you are encountering this problem running a simulator binary within gdb, make sure you 'set start-with-shell off' first.

谢谢!

这是完整的脚本:

#!/bin/bash

DEVROOT=/Developer/Platforms/iPhoneOS.platform/Developer
SDKROOT=$DEVROOT/SDKs/iPhoneOS4.2.sdk

rm -rf  /Users/montx/mylibs_sdk42
mkdir /Users/montx/mylibs_sdk42 #Store there compiled libs
make clean

#Build ARM library
./configure --host=arm-apple-darwin --without-readline --disable-ipv6 CC=$DEVROOT/usr/bin/arm-apple-darwin9-gcc-4.0.1 CPPFLAGS="-I$SDKROOT/usr/lib/gcc/arm-apple-darwin9/4.0.1/include/ -I$SDKROOT/usr/include/" CFLAGS="$CPPFLAGS -arch armv6 -pipe -no-cpp-precomp -isysroot $SDKROOT" CPP="$DEVROOT/usr/bin/cpp $CPPFLAGS" LD=$DEVROOT/usr/bin/ld
make -C src/interfaces/libpq
cp /Users/montx/Downloads/postgresql-8.4.1/src/interfaces/libpq/libpq.a /Users/montx/mylibs_sdk42/libpq.arm


#Build ARM library
./configure --host=arm-apple-darwin --without-readline --disable-ipv6 CC=$DEVROOT/usr/bin/arm-apple-darwin9-gcc-4.0.1 CPPFLAGS="-I$SDKROOT/usr/lib/gcc/arm-apple-darwin9/4.0.1/include/ -I$SDKROOT/usr/include/" CFLAGS="$CPPFLAGS -arch armv6 -pipe -no-cpp-precomp -isysroot $SDKROOT" CPP="$DEVROOT/usr/bin/cpp $CPPFLAGS" LD=$DEVROOT/usr/bin/ld



#Then build i386 library ==> the simulator is 32bits


CFLAGS="$(OTHER_CFLAGS) -mmacosx-version-min=10.5"
LDFLAGS="$(OTHER_LDFLAGS) -mmacosx-version-min=10.5"

make clean && ./configure CFLAGS="-arch i386 -isysroot /Developer/SDKs/MacOSX10.5.sdk -mmacosx-version-min=10.5" && make -C src/interfaces/libpq


cp src/interfaces/libpq/libpq.a  /Users/montx/mylibs_sdk42/libpq.i386

#Then make fat binary
$DEVROOT/usr/bin/lipo -arch armv6 /Users/montx/mylibs_sdk42/libpq.arm -arch i386 /Users/montx/mylibs_sdk42/libpq.i386 -create -output  /Users/montx/mylibs_sdk42/libpq

【问题讨论】:

    标签: postgresql ios compilation ios-4.2 libpq


    【解决方案1】:

    github上有项目“libpq-ios”。我用过。

    https://github.com/spacialdb/libpq-ios http://devcenter.spacialdb.com/iOS.html

    【讨论】:

      【解决方案2】:

      这适用于 arm 库,但我使用的是 gcc 4.2,而且我的目标是 armv7

      DEVROOT=/Developer/Platforms/iPhoneOS.platform/Developer
      SDKROOT=$DEVROOT/SDKs/iPhoneOS4.2.sdk
      ./configure --host=arm-apple-darwin --without-readline --disable-ipv6 \
        CC="$DEVROOT/usr/bin/gcc" \
        CPPFLAGS="-I$SDKROOT/usr/lib/gcc/arm-apple-darwin10/4.2.1/include/ \
                  -I$SDKROOT/usr/include/" \
        CFLAGS="$CPPFLAGS -arch armv7 -pipe -no-cpp-precomp -isysroot $SDKROOT" \
        CPP="$DEVROOT/usr/bin/cpp $CPPFLAGS" \
        LD=$DEVROOT/usr/bin/ld 
      make -C src/interfaces/libpq 
      cp src/interfaces/libpq/libpq.a lib/libpq.arm
      

      虽然我的模拟器旧脚本不再工作,但它在 iOS 3.2 中再次正常工作。

      DEVROOT=/Developer/Platforms/iPhoneSimulator.platform/Developer 
      SDKROOT=$DEVROOT/SDKs/iPhoneSimulator4.2.sdk
      $ROOT_DIR/configure --host=i386-apple-darwin  \
        CC="$DEVROOT/usr/bin/gcc" \
        CPPFLAGS="-I$SDKROOT/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ \
                  -I$SDKROOT/usr/include/ -mmacosx-version-min=10.5" \
        CFLAGS="$CPPFLAGS -arch i386 -pipe -no-cpp-precomp -isysroot $SDKROOT \
                -mmacosx-version-min=10.5" \
        CPP="$DEVROOT/usr/bin/cpp $CPPFLAGS" \
        LD=$DEVROOT/usr/bin/ld
      
      make -C $ROOT_DIR/src/interfaces/libpq
      

      更新

      这是完整的脚本。将 bash 脚本放入 postgres 目录并构建。在您的项目中包含 $POSTGRESDIR/src/include 和 $POSTGRESDIR/src/interfaces/libpq 以获取必要的标头。请注意,这适用于 Postgres 8。尚未在 Postgres 9 上测试过。

      #!/bin/bash
      set -e
      
      if [ -d "./lib" ]
      then
          echo "Existing libs deleted"
          rm -rf lib/*
      else
          echo "Generating output directory"
          mkdir lib
      fi
      
      if [ -e "./src/Makefile.global" ]
      then
          make -C ./src/interfaces/libpq distclean
      fi
      
      chmod u+x ./configure
      
      #Build i386 library
      DEVROOT=/Developer/Platforms/iPhoneSimulator.platform/Developer 
      SDKROOT=$DEVROOT/SDKs/iPhoneSimulator4.2.sdk
      ./configure --host=i386-apple-darwin  --without-readline --disable-ipv6 \
        CC="$DEVROOT/usr/bin/gcc-4.2" \
        CPPFLAGS="-I$SDKROOT/usr/lib/gcc/i686-apple-darwin10/4.2.1/include/ -I$SDKROOT/usr/include/ -mmacosx-version-min=10.5" \
        CFLAGS="$CPPFLAGS -arch i386 -pipe -no-cpp-precomp -isysroot $SDKROOT -mmacosx-version-min=10.5" \
        CPP="$DEVROOT/usr/bin/cpp $CPPFLAGS" \
        LD=$DEVROOT/usr/bin/ld
      
      make -C ./src/interfaces/libpq
      cp ./src/interfaces/libpq/libpq.a lib/libpq.i386
      
      #Build ARM library
      make -C ./src/interfaces/libpq distclean
      
      DEVROOT=/Developer/Platforms/iPhoneOS.platform/Developer
      SDKROOT=$DEVROOT/SDKs/iPhoneOS4.2.sdk
      ./configure --host=arm-apple-darwin --without-readline --disable-ipv6 \
        CC="$DEVROOT/usr/bin/gcc-4.2" \
        CPPFLAGS="-I$SDKROOT/usr/lib/gcc/arm-apple-darwin10/4.2.1/include/ -I$SDKROOT/usr/include/" \
        CFLAGS="$CPPFLAGS -arch armv7 -pipe -no-cpp-precomp -isysroot $SDKROOT" \
        CPP="$DEVROOT/usr/bin/cpp $CPPFLAGS" \
        LD=$DEVROOT/usr/bin/ld 
      make -C ./src/interfaces/libpq 
      cp ./src/interfaces/libpq/libpq.a lib/libpq.arm
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-13
        • 2011-12-07
        • 1970-01-01
        • 2011-06-03
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        相关资源
        最近更新 更多