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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1678381/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-14 18:56:24  来源:igfitidea点击:

Connect iPhone App to PostgreSQL Using Libpq

xcodepostgresqliphone-sdk-3.0libpq

提问by Kuberchaun

I need to create an application for the iPhone that will connect to a PostgreSQL 8.4 database using libpq. The problem is I can't get a simple iPhone that links to libpq to compile. I am however able to get the equivalent application that is a regular Mac desktop app to compile and connect to PostgreSQL without any issues. I'm on Xcode 3.2 running on Snow Leopard.

我需要为 iPhone 创建一个应用程序,该应用程序将使用 libpq 连接到 PostgreSQL 8.4 数据库。问题是我无法获得链接到 libpq 进行编译的简单 iPhone。然而,我能够获得等效的应用程序,它是一个普通的 Mac 桌面应用程序来编译和连接到 PostgreSQL,没有任何问题。我在 Xcode 3.2 上运行 Snow Leopard。

I'm building libpq for both arm and for x86_84. The arm build is for the real iPhone and the x86_64 is for the iPhone simulator to use. I then create a fat binary that contains both files and end up with a file named libpq. This file is the one I use in the regular Mac app and it works fine and causes issues when trying to build the iPhone app.

我正在为 arm 和 x86_84 构建 libpq。arm 构建用于真正的 iPhone,x86_64 用于 iPhone 模拟器使用。然后我创建了一个包含这两个文件的胖二进制文件,并以一个名为 libpq 的文件结束。这个文件是我在常规 Mac 应用程序中使用的文件,它运行良好,但在尝试构建 iPhone 应用程序时会导致问题。

Here is my build script when I build libpq.

这是我构建 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

Here is the build log when I try to compile the iPhone app from within Xcode.

这是我尝试从 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

Anyone else run into this that can help out?

还有其他人遇到这个可以帮忙吗?

Thanks StartShip3000

感谢 StartShip3000

回答by Louis Gerbarg

It looks like you are not actually linking in the library. You have added the directory it is in to your search path, but I don't see -lpqanywhere on your link line.

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

Also, the simulator environment is 32 bit only, x86_64 libs won't work with simulator binaries.

此外,模拟器环境仅为 32 位,x86_64 库不适用于模拟器二进制文件。

回答by Kuberchaun

Ok got around the issue thanks from the comment by Louis. I did this by changing makefile line that built the i386 version. I added CFLAGS=-arch i386" to look like this

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

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

I now have another issue that I will post a new question to an reference this link.

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

回答by Nenad

You can try using PGSQLKit for iOS from http://www.postgresqlformac.com

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