2009-11-05 4 views
1

Je dois créer une application pour l'iPhone qui se connectera à une base de données PostgreSQL 8.4 en utilisant libpq. Le problème est que je ne peux pas obtenir un simple iPhone qui lie à libpq pour compiler. Je suis cependant capable d'obtenir l'application équivalente qui est une application de bureau Mac ordinaire pour compiler et se connecter à PostgreSQL sans aucun problème. Je suis sur Xcode 3.2 en cours d'exécution sur Snow Leopard.Connexion de l'application iPhone à PostgreSQL Utilisation de Libpq

Je construis libpq pour arm et x86_84. La construction de bras est pour le vrai iPhone et le x86_64 est pour le simulateur d'iPhone à utiliser. Je crée ensuite un gros binaire qui contient les deux fichiers et se termine avec un fichier nommé libpq. Ce fichier est celui que j'utilise dans l'application Mac classique et il fonctionne correctement et provoque des problèmes lors de la création de l'application iPhone.

Voici mon script de construction lorsque je compile 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 

Voici le journal de construction lorsque j'essaie de compiler l'application iPhone depuis Xcode.

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 

Quelqu'un d'autre rencontre cela qui peut aider?

Merci StartShip3000

Répondre

5

Il semble que vous n'êtes pas liez réellement dans la bibliothèque. Vous avez ajouté le répertoire dans lequel il se trouve à votre chemin de recherche, mais je ne vois pas -lpq sur votre ligne de lien.

De plus, l'environnement du simulateur est de 32 bits seulement, les librairies x86_64 ne fonctionneront pas avec les binaires du simulateur.

+0

Je pense que la pièce qui m'apporte est que le simulateur est de 32 bits seulement Par défaut, ma compilation de libpq doit maintenant être x86_84, maintenant que je suis sur Snow Leopard (je pense). message "libpq, manque l'architecture requise dans le fichier i386" Pour ne pas avoir libpq sur la ligne de lien pour mon application Mac, je viens de copier le gras binaire lipq dans mon groupe de ressources de projets. semble être tiré bien. Mais je dois garder cela à l'esprit. Je vais voir si je peux obtenir libpq pour être construit comme -arch i386 et si mon problème disparaît. Merci beaucoup – Kuberchaun

1

Ok a contourné le problème grâce au commentaire de Louis. Je l'ai fait en changeant la ligne makefile qui a construit la version i386. J'ai ajouté CFLAGS = -arch i386" pour ressembler à ceci

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

J'ai maintenant une autre question que je vais poster une nouvelle question à une référence sur ce lien.

Questions connexes