2009-11-05 4 views
1

libpq를 사용하여 PostgreSQL 8.4 데이터베이스에 연결할 iPhone 용 응용 프로그램을 만들어야합니다. 문제는 컴파일 할 libpq에 링크 된 간단한 iPhone을 얻을 수 없다는 것입니다. 그러나 나는 일반 Mac 데스크탑 응용 프로그램 인 PostgreSQL에 컴파일하고 동일한 문제없이 연결할 수있는 동일한 응용 프로그램을 사용할 수 있습니다. Snow Leopard에서 Xcode 3.2를 실행 중입니다.Libpq를 사용하여 iPhone 응용 프로그램을 PostgreSQL에 연결하십시오.

팔과 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

답변

5

것 같습니다. 디렉토리가 검색 경로에 추가되었지만 링크 행의 아무 곳에서나 -lpq이 보이지 않습니다.

또한 시뮬레이터 환경은 32 비트 전용이므로 x86_64 라이브러리는 시뮬레이터 바이너리와 작동하지 않습니다.

+0

필자는 나를 모으는 부분은 시뮬레이터가 32 비트 밖에 없다고 생각합니다. 기본적으로 libpq 빌드는 현재 x86_84이어야하며 이제는 Snow Leopard에 있습니다. 메시지 "libpq, 파일에서 필요한 아키텍처 i386이 없습니다."내 Mac 응용 프로그램의 링크 행에 libpq이 없기 때문에 나는 lipq fat 바이너리를 내 프로젝트 자원 그룹에 복사했습니다. 벌금을 물게된다. 그러나 나는 그것을 명심해야 할 것이다. libpq를 -arch i386으로 빌드 할 수 있는지 그리고 문제가 없어지는지 살펴 보겠습니다. 감사합니다. – Kuberchaun

1

루이스의 의견 덕분에 문제가 해결되었습니다. i386 버전을 빌드 한 makefile 라인을 변경하여이 작업을 수행했습니다. 나는이

#Then build i386 library 
make clean && ./configure CFLAGS="-arch i386" && make -C src/interfaces/libpq 
지금 내가 참고로이 링크를 새 질문을 게시 할 예정입니다 또 다른 문제가

처럼 보이도록 CFLAGS = -arch i386을 "을 추가했다.