Xcode 使用Libpq将iPhone应用程序连接到PostgreSQL

Xcode 使用Libpq将iPhone应用程序连接到PostgreSQL,xcode,postgresql,iphone-sdk-3.0,libpq,Xcode,Postgresql,Iphone Sdk 3.0,Libpq,我需要为iPhone创建一个应用程序,该应用程序将使用libpq连接到PostgreSQL 8.4数据库。问题是我无法得到一个链接到libpq的简单iPhone来编译。然而,我能够得到一个与之相当的应用程序,它是一个普通的Mac桌面应用程序,可以编译并连接到PostgreSQL,而不会出现任何问题。我在Xcode 3.2上运行雪豹 我正在为arm和x86_84构建libpq。arm构建是为真正的iPhone而设计的,x86_64是为iPhone模拟器而设计的。然后,我创建了一个包含这两个文件的胖

我需要为iPhone创建一个应用程序,该应用程序将使用libpq连接到PostgreSQL 8.4数据库。问题是我无法得到一个链接到libpq的简单iPhone来编译。然而,我能够得到一个与之相当的应用程序,它是一个普通的Mac桌面应用程序,可以编译并连接到PostgreSQL,而不会出现任何问题。我在Xcode 3.2上运行雪豹

我正在为arm和x86_84构建libpq。arm构建是为真正的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

看起来您实际上没有在库中链接。您已将它所在的目录添加到搜索路径中,但我在您的链接线上的任何位置都没有看到
-lpq


此外,模拟器环境仅为32位,x86_64 libs不能与模拟器二进制文件一起使用。

看起来您实际上没有在库中链接。您已将它所在的目录添加到搜索路径中,但我在您的链接线上的任何位置都没有看到
-lpq


另外,模拟器环境仅为32位,x86_64 libs不能与模拟器二进制文件一起工作。

好了,谢谢Louis的评论。为此,我更改了构建i386版本的makefile行。我添加了CFLAGS=-arch i386“如下所示

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

我现在有另一个问题,我将在这个链接的参考资料中发布一个新问题。

谢谢Louis的评论,Ok绕过了这个问题。我改变了构建i386版本的makefile行。我添加了CFLAGS=-arch i386“如下所示

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

我现在有另一个问题,我将在该链接的参考资料中发布一个新问题。

您可以尝试从中使用PGSQLKit for iOS

您可以尝试从中使用PGSQLKit for iOS

我想让我明白的是模拟器只有32位。默认情况下,我的libpq构建现在必须是x86_84,因为我现在在雪豹上(我想)。这就解释了为什么我一直收到消息“libpq,文件中缺少必需的架构i386”。由于我的Mac应用程序的链接线上没有libpq,我只是将lipq-fat二进制文件复制到我的项目资源组中,它似乎被很好地拉了进来。但我必须记住这一点。我将看看是否可以将libpq构建为arch i386,以及我的问题是否消失。谢谢,我想让我明白的是模拟器只有32位。默认情况下,我的libpq构建现在必须是x86_84,因为我现在在雪豹上(我想)。这就解释了为什么我一直收到消息“libpq,文件中缺少必需的架构i386”。由于我的Mac应用程序的链接线上没有libpq,我只是将lipq-fat二进制文件复制到我的项目资源组中,它似乎被很好地拉了进来。但我必须记住这一点。我将看看是否可以将libpq构建为arch i386,以及我的问题是否消失。非常感谢。