【问题标题】:Connect iPhone App to PostgreSQL Using Libpq使用 Libpq 将 iPhone 应用程序连接到 PostgreSQL
【发布时间】:2026-02-12 16:20:06
【问题描述】:

我需要为 iPhone 创建一个应用程序,该应用程序将使用 libpq 连接到 PostgreSQL 8.4 数据库。问题是我无法获得链接到 libpq 进行编译的简单 iPhone。但是,我能够获得作为常规 Mac 桌面应用程序的等效应用程序来编译并连接到 PostgreSQL,而不会出现任何问题。我在 Snow Leopard 上运行 Xcode 3.2。

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

【问题讨论】:

    标签: xcode postgresql iphone-sdk-3.0 libpq


    【解决方案1】:

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

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

    【讨论】:

    • 我认为让我感兴趣的是模拟器只有 32 位。默认情况下,我的 libpq 构建现在必须是 x86_84,现在我在 Snow Leopard 上(我认为)。这就解释了为什么我不断收到消息“libpq,文件中缺少所需的架构 i386”。由于我的 Mac 应用程序的链接行上没有 libpq,我只是将 lipq fat 二进制文件复制到我的项目资源组中,它似乎被很好地拉入了。但我必须牢记这一点。我会看看是否可以将 libpq 构建为 -arch i386 以及我的问题是否消失。谢谢
    【解决方案2】:

    好的,感谢 Louis 的评论,解决了这个问题。我通过更改构建 i386 版本的 makefile 行来做到这一点。我添加了 CFLAGS=-arch i386" 看起来像这样

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

    我现在有另一个问题,我将发布一个新问题以引用此链接。

    【讨论】:

      【解决方案3】:

      您可以从http://www.postgresqlformac.com 尝试使用适用于 iOS 的 PGSQLKit

      【讨论】:

        最近更新 更多