1

libpqを使用してPostgreSQL8.4データベースに接続するiPhone用のアプリケーションを作成する必要があります。問題は、libpqにリンクしてコンパイルする単純なiPhoneを入手できないことです。ただし、通常のMacデスクトップアプリと同等のアプリケーションを入手して、問題なくコンパイルしてPostgreSQLに接続することができます。SnowLeopardで実行されているXcode3.2を使用しています。

私はarmとx86_84の両方のlibpqを構築しています。アームビルドは実際のiPhone用であり、x86_64はiPhoneシミュレーターが使用するためのものです。次に、両方のファイルを含むファットバイナリを作成し、libpqという名前のファイルを作成します。このファイルは私が通常のMacアプリで使用しているファイルであり、正常に動作し、iPhoneアプリをビルドしようとすると問題が発生します。

libpqをビルドするときのビルドスクリプトは次のとおりです。

#!/bin/bash

DEVROOT=/Developer/Platforms/iPhoneOS.platform/Developer
SDKROOT=$DEVROOT/SDKs/iPhoneOS3.0.sdk

rm -rf  /Users/bob/mylibs
mkdir /Users/bob/mylibs #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/bob/Downloads/postgresql-8.4.1/src/interfaces/libpq/libpq.a /Users/bob/mylibs/libpq.arm

#Then build i386 library
make clean && ./configure  && make -C src/interfaces/libpq
cp src/interfaces/libpq/libpq.a  /Users/bob/mylibs/libpq.i386

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

Xcode内からiPhoneアプリをコンパイルしようとしたときのビルドログは次のとおりです。

Build iPhonePg of project iPhonePg with configuration Debug

Ld build/Debug-iphonesimulator/iPhonePg.app/iPhonePg normal i386
cd /Users/bob/Documents/Programming/PragProgrammerIphoneSDK/iPhonePg
setenv MACOSX_DEPLOYMENT_TARGET 10.5
setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc-4.2 -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk -L/Users/bob/Documents/Programming/PragProgrammerIphoneSDK/iPhonePg/build/Debug-iphonesimulator -L../../../../mylibs -L/Users/bob/Documents/Programming/PragProgrammerIphoneSDK/iPhonePg -L/Users/bob/Documents/Programming/PragProgrammerIphoneSDK/iPhonePg/../../../../mylibs -F/Users/bob/Documents/Programming/PragProgrammerIphoneSDK/iPhonePg/build/Debug-iphonesimulator -filelist /Users/bob/Documents/Programming/PragProgrammerIphoneSDK/iPhonePg/build/iPhonePg.build/Debug-iphonesimulator/iPhonePg.build/Objects-normal/i386/iPhonePg.LinkFileList -mmacosx-version-min=10.5 -framework Foundation -framework UIKit -framework CoreGraphics /Users/bob/Documents/Programming/PragProgrammerIphoneSDK/iPhonePg/libpq -o /Users/bob/Documents/Programming/PragProgrammerIphoneSDK/iPhonePg/build/Debug-iphonesimulator/iPhonePg.app/iPhonePg

ld: warning: in /Users/bob/Documents/Programming/PragProgrammerIphoneSDK/iPhonePg/libpq, missing required architecture i386 in file
Undefined symbols:
  "_PQclear", referenced from:
      -[iPhonePgAppDelegate applicationDidFinishLaunching:] in iPhonePgAppDelegate.o
  "_PQerrorMessage", referenced from:
      -[iPhonePgAppDelegate applicationDidFinishLaunching:] in iPhonePgAppDelegate.o
  "_PQconnectdb", referenced from:
      -[iPhonePgAppDelegate applicationDidFinishLaunching:] in iPhonePgAppDelegate.o
  "_PQfinish", referenced from:
      -[iPhonePgAppDelegate applicationDidFinishLaunching:] in iPhonePgAppDelegate.o
  "_PQstatus", referenced from:
      -[iPhonePgAppDelegate applicationDidFinishLaunching:] in iPhonePgAppDelegate.o
  "_PQexec", referenced from:
      -[iPhonePgAppDelegate applicationDidFinishLaunching:] in iPhonePgAppDelegate.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

他の誰かが助けることができるこれに遭遇しますか?

StartShip3000に感謝します

4

3 に答える 3

5

ライブラリで実際にリンクしていないようです。-lpq検索パスにディレクトリを追加しましたが、リンク行のどこにも表示されません。

また、シミュレーター環境は32ビットのみであり、x86_64ライブラリーはシミュレーターバイナリーでは機能しません。

于 2009-11-05T07:15:29.783 に答える
1

ルイのコメントから、問題を回避できました。これは、i386バージョンをビルドしたmakefile行を変更することで行いました。CFLAGS =-archi386"を次のように追加しました

#Then build i386 library
make clean && ./configure CFLAGS="-arch i386" && make -C src/interfaces/libpq

このリンクを参照するために新しい質問を投稿するという別の問題があります。

于 2009-11-08T04:59:03.773 に答える
1

http://www.postgresqlformac.comからiOS用のPGSQLKitを使用してみることができます

于 2010-10-22T22:42:05.997 に答える