2012-03-01 37 views
5

Tôi đang cố gắng chạy tập lệnh để xây dựng OpenSSL cho iOS (armv6, armv7 và i386) làm 'tập lệnh chạy' giai đoạn trong Xcode.Kịch bản lệnh OpenSSL không thành công khi chạy dưới dạng giai đoạn 'chạy tập lệnh' trong Xcode (thành công ngoài Xcode)

Kịch bản tạo thành công khi chạy từ dòng lệnh dưới dạng tập lệnh độc lập. Kết quả là một thư mục được biên soạn libcrypto.a, libssl.ainclude với tiêu đề.

Tuy nhiên, khi tôi chạy tập lệnh dưới dạng giai đoạn chạy tập lệnh trong Xcode, nó sẽ hướng đến phần cuối của lỗi và phát hiện ra rằng nó không thể tìm thấy bất kỳ biểu tượng nào được tham chiếu từ libcrypto.

shlib_target=; if [ -n "" ]; then \ 
     shlib_target="bsd-gcc-shared"; \ 
    fi; \ 
    LIBRARIES="-L.. -lssl -L.. -lcrypto" ; \ 
    make -f ../Makefile.shared -e \ 
     APPNAME=openssl OBJECTS="openssl.o verify.o asn1pars.o req.o dgst.o dh.o dhparam.o enc.o passwd.o gendh.o errstr.o ca.o pkcs7.o crl2p7.o crl.o rsa.o rsautl.o dsa.o dsaparam.o ec.o ecparam.o x509.o genrsa.o gendsa.o genpkey.o s_server.o s_client.o speed.o s_time.o apps.o s_cb.o s_socket.o app_rand.o version.o sess_id.o ciphers.o nseq.o pkcs12.o pkcs8.o pkey.o pkeyparam.o pkeyutl.o spkac.o smime.o cms.o rand.o engine.o ocsp.o prime.o ts.o" \ 
     LIBDEPS=" $LIBRARIES " \ 
     link_app.${shlib_target} 
(:; LIBDEPS="${LIBDEPS:--L.. -lssl -L.. -lcrypto }"; LDCMD="${LDCMD:-/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc -arch i386}"; LDFLAGS="${LDFLAGS:--isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk -DOPENSSL_THREADS -pthread -D_THREAD_SAFE -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DTERMIOS -O3 -fomit-frame-pointer -Wall}"; LIBPATH=`for x in $LIBDEPS; do echo $x; done | sed -e 's/^ *-L//;t' -e d | uniq`; LIBPATH=`echo $LIBPATH | sed -e 's/ /:/g'`; LD_LIBRARY_PATH=$LIBPATH:$LD_LIBRARY_PATH ${LDCMD} ${LDFLAGS} -o ${APPNAME:=openssl} openssl.o verify.o asn1pars.o req.o dgst.o dh.o dhparam.o enc.o passwd.o gendh.o errstr.o ca.o pkcs7.o crl2p7.o crl.o rsa.o rsautl.o dsa.o dsaparam.o ec.o ecparam.o x509.o genrsa.o gendsa.o genpkey.o s_server.o s_client.o speed.o s_time.o apps.o s_cb.o s_socket.o app_rand.o version.o sess_id.o ciphers.o nseq.o pkcs12.o pkcs8.o pkey.o pkeyparam.o pkeyutl.o spkac.o smime.o cms.o rand.o engine.o ocsp.o prime.o ts.o ${LIBDEPS}) 

Undefined symbols for architecture i386: 
    "_ENGINE_load_gost", referenced from: 
     _ENGINE_load_builtin_engines in libcrypto.a(eng_all.o) 
ld: symbol(s) not found for architecture i386 
collect2: ld returned 1 exit status 
make[2]: *** [link_app.] Error 1 
make[1]: *** [openssl] Error 2 
make: *** [build_apps] Error 1 

Tôi gần như chắc chắn rằng đây là vấn đề đường dẫn, nhưng tôi không thể biết cách nói cho Xcode (hoặc tập lệnh) sử dụng đường dẫn nào.

Kịch bản, available here, cần được sửa đổi để tính toán các thay đổi gần đây về vị trí của công cụ nhà phát triển với Xcode 4.3 (cụ thể là Nhà phát triển/không còn ở gốc, nhưng thực sự bên trong Xcode.app) .

Dưới đây là kịch bản cho câu hỏi đầy đủ:

#!/bin/sh 

# Automatic build script for libssl and libcrypto 
# for iPhoneOS and iPhoneSimulator 
# 
# Created by Felix Schulze on 16.12.10. 
# Copyright 2010 Felix Schulze. All rights reserved. 
# 
# Licensed under the Apache License, Version 2.0 (the "License"); 
# you may not use this file except in compliance with the License. 
# You may obtain a copy of the License at 
# 
# http://www.apache.org/licenses/LICENSE-2.0 
# 
# Unless required by applicable law or agreed to in writing, software 
# distributed under the License is distributed on an "AS IS" BASIS, 
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
# See the License for the specific language governing permissions and 
# limitations under the License. 
# 
########################################################################### 
# Change values here              # 
#                   # 
VERSION="1.0.0c"               # 
SDKVERSION="5.0"               # 
#                   # 
########################################################################### 
#                   # 
# Don't change anything under this line!         # 
#                   # 
########################################################################### 



CURRENTPATH=`pwd` 
CURRENTPATH="${CURRENTPATH}/openssl" 

set -e 
if [ ! -e openssl-${VERSION}.tar.gz ]; then 
echo "Downloading openssl-${VERSION}.tar.gz" 
curl -O http://www.openssl.org/source/openssl-${VERSION}.tar.gz 
else 
echo "Using openssl-${VERSION}.tar.gz" 
fi 

mkdir -p "${CURRENTPATH}/src" 
tar zxf openssl-${VERSION}.tar.gz -C "${CURRENTPATH}/src" 
rm openssl-${VERSION}.tar.gz 
cd "${CURRENTPATH}/src/openssl-${VERSION}" 


############ 
# iPhone Simulator 
echo "Building openssl for iPhoneSimulator ${SDKVERSION} i386" 
echo "Please stand by..." 

export CC="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc -arch i386" 
mkdir -p "${CURRENTPATH}/bin/iPhoneSimulator${SDKVERSION}.sdk" 

LOG="${CURRENTPATH}/bin/iPhoneSimulator${SDKVERSION}.sdk/build-openssl-${VERSION}.log" 

./configure BSD-generic32 --openssldir="${CURRENTPATH}/bin/iPhoneSimulator${SDKVERSION}.sdk" > "${LOG}" 2>&1 
# add -isysroot to CC= 
sed -ie "s!^CFLAG=!CFLAG=-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator${SDKVERSION}.sdk !" "Makefile" 

make >> "${LOG}" 2>&1 
make install >> "${LOG}" 2>&1 
make clean >> "${LOG}" 2>&1 
############# 

############# 
# iPhoneOS armv6 
echo "Building openssl for iPhoneOS ${SDKVERSION} armv6" 
echo "Please stand by..." 

export CC="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc -arch armv6" 
mkdir -p "${CURRENTPATH}/bin/iPhoneOS${SDKVERSION}-armv6.sdk" 

LOG="${CURRENTPATH}/bin/iPhoneOS${SDKVERSION}-armv6.sdk/build-openssl-${VERSION}.log" 

./configure BSD-generic32 --openssldir="${CURRENTPATH}/bin/iPhoneOS${SDKVERSION}-armv6.sdk" > "${LOG}" 2>&1 

sed -ie "s!^CFLAG=!CFLAG=-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS${SDKVERSION}.sdk !" "Makefile" 
# remove sig_atomic for iPhoneOS 
sed -ie "s!static volatile sig_atomic_t intr_signal;!static volatile intr_signal;!" "crypto/ui/ui_openssl.c" 

make >> "${LOG}" 2>&1 
make install >> "${LOG}" 2>&1 
make clean >> "${LOG}" 2>&1 
############# 

############# 
# iPhoneOS armv7 
echo "Building openssl for iPhoneOS ${SDKVERSION} armv7" 
echo "Please stand by..." 

export CC="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc -arch armv7" 
mkdir -p "${CURRENTPATH}/bin/iPhoneOS${SDKVERSION}-armv7.sdk" 

LOG="${CURRENTPATH}/bin/iPhoneOS${SDKVERSION}-armv7.sdk/build-openssl-${VERSION}.log" 


./configure BSD-generic32 --openssldir="${CURRENTPATH}/bin/iPhoneOS${SDKVERSION}-armv7.sdk" >> "${LOG}" 2>&1 

sed -ie "s!^CFLAG=!CFLAG=-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS${SDKVERSION}.sdk !" "Makefile" 
# remove sig_atomic for iPhoneOS 
sed -ie "s!static volatile sig_atomic_t intr_signal;!static volatile intr_signal;!" "crypto/ui/ui_openssl.c" 

make >> "${LOG}" 2>&1 
make install >> "${LOG}" 2>&1 
make clean >> "${LOG}" 2>&1 
############# 

echo "Build library..." 
lipo -create ${CURRENTPATH}/bin/iPhoneSimulator${SDKVERSION}.sdk/lib/libssl.a ${CURRENTPATH}/bin/iPhoneOS${SDKVERSION}-armv6.sdk/lib/libssl.a ${CURRENTPATH}/bin/iPhoneOS${SDKVERSION}-armv7.sdk/lib/libssl.a -output ${CURRENTPATH}/libssl.a 

lipo -create ${CURRENTPATH}/bin/iPhoneSimulator${SDKVERSION}.sdk/lib/libcrypto.a ${CURRENTPATH}/bin/iPhoneOS${SDKVERSION}-armv6.sdk/lib/libcrypto.a ${CURRENTPATH}/bin/iPhoneOS${SDKVERSION}-armv7.sdk/lib/libcrypto.a -output ${CURRENTPATH}/libcrypto.a 

mkdir -p ${CURRENTPATH}/include 
cp -R ${CURRENTPATH}/bin/iPhoneSimulator${SDKVERSION}.sdk/include/openssl ${CURRENTPATH}/include/ 
echo "Building done." 

Trả lời

1

Nó được ghi lại như một vấn đề trên openssl.

Điều chỉnh dòng cấu hình của bạn:

./Configure darwin64-x86_64-cc zlib no-asm no-krb5 shared 
+2

Điều đó có thể hiệu quả nếu bạn đang xây dựng cho hệ điều hành Mac OS X 64 bit, nhưng tôi đang cố gắng xây dựng cho iOS, (do đó cần armv6, armv7 và i386). Tôi phải chỉ định 'BSD-generic32' như trái ngược với' darwin-x86_64' và iOS cũng không cho phép các thư viện chia sẻ. Tôi đã thử cấu hình với BSD của tôi và không có tùy chọn chia sẻ, nhưng tôi nhận được lỗi tương tự như tôi đã nêu trong câu hỏi gốc. – Jasarien

1

Mặc dù đây là một bài cũ, tôi nghĩ rằng vấn đề vẫn còn tồn tại. Nhưng tôi nghĩ tôi đã tìm ra một giải pháp rất đơn giản. Chỉ cần thêm dòng sau vào Build-Script, trước khi "Configure" hoặc "make" được gọi là:

export COMMAND_MODE=unix2003 

Điều này sẽ làm điều này.

Các vấn đề liên quan