32 ve 64 bit mimariler için OS X üzerinde OpenSSL oluşturmam gerekiyor. ./Configure
'a vermem gereken seçenekler nelerdir, böylece her iki mimariye de aynı .a dosyasına gömülür mü?OS X
OS X
cevap
./Yapılandırmayı, her iki mimaride de aynı .a dosyasına yerleştirmemi sağlayın. Kütüphane çok kanallı olmadığından, OpenSSL ve çoklu arşiv kitaplıklarına dikkat etmeniz gerekir. Bunun nedeni, her yapılandırmanın kendi <openssl/opensslconf.h>
dosyasına sahip olması ve her bir platformun BIGNUM
farklı olmasıdır.
-arch x86_64 -arch i386
temini çünkü OpenSSL inşa sistem komutlarını oluşturan yol birikimi başarısızlıkla sonuçlanacaktır. Ayrıca bkz. Getting libcrypto ar error while compiling OpenSSL for Mac.
aşağıda ayrıntılı Aynı yöntem, iOS için geçerlidir. Değişen tek şey -arch
. iOS için, muhtemelen armv7
, armv7s
, arm64
ve i386
(64-bit simülatör ayıklama için) ve x86_64
(32-bit simülatör ayıklama için) kullanacağız.
gerekli başka değil çok belirgin numara yok. OpenSSL sabit kodları, --prefix
ve --openssldir
tabanlı bazı varsayılan yolları, bu nedenle kurulum dizini için 32 bit oluşturmalı, kurmalı ve sonra taşımalısınız; daha sonra yükleme dizini için 64 bit kurun, yükleyin ve taşıyın; ve daha sonra yükleme dizinindeki yağ kitaplığını oluşturun. Ayrıca Nihayet How to determine the default location for openssl.cnf?
, OS X en OpenSSL'yi verilen yerini görüyorum. OpenSSL 1.0.x ve 1.1.x, Apple'ın 0.9.8 sürümü OpenSSL ile uyumlu olan numaralı değil. Uyumsuzluklardan dolayı, aşağıdaki prosedürler $HOME/ssl
'u kullanır. /usr/local/ssl
veya zevkinize uygun başka bir yer kullanabilirsiniz. Başlamadan önce
, OpenSSL wiki Compilation and Installation bir sayfası vardır. config
ürününe tedarik edilecek birçok seçenek var. Zevke uygun olanları seçin. Her zaman no-ssl2
kullanın ve genellikle no-ssl3
, no-comp
kullanın. Mobil cihazlarda ben no-srp
, no-psk
, no-hw
, no-dso
ve no-engines
kullanın.
Kitaplığı oluşturmak için yönergeler aşağıda verilmiştir. Çok aşamalı yapınızda desteklediğiniz her bir mimari için yapılandırma, oluşturma, yükleme ve taşıma yapacaksınız.
32-bit
make clean && make dclean
KERNEL_BITS=32 ./config no-ssl2 no-ssl3 --prefix=$HOME/ssl
make depend
make
make install_sw
mv $HOME/ssl/include/openssl/opensslconf.h $HOME/ssl/include/openssl/opensslconf-x86.h
mv $HOME/ssl/include/openssl/bn.h $HOME/ssl/include/openssl/bn-x86.h
mv $HOME/ssl/ $HOME/ssl-x86
64-bit
make clean && make dclean
KERNEL_BITS=64 ./config no-ssl2 no-ssl3 --prefix=$HOME/ssl
make depend
make
make install_sw
mv $HOME/ssl/include/openssl/opensslconf.h $HOME/ssl/include/openssl/opensslconf-x64.h
mv $HOME/ssl/include/openssl/bn.h $HOME/ssl/include/openssl/bn-x64.h
mv $HOME/ssl/ $HOME/ssl-x64
Başlıkları Sen (hangisi olduğu önemli değil) başlıklarından bir set kopyalamanız gerekir
, kopya opensslconf-x86.h
, opensslconf-x64.h
bn-x86.h
ve bn-x64.h
, yeni bir <openssl/opensslconf.h>
oluşturun, yeni bir <openssl/bn.h>
oluşturun ve sonunda çoklu kitaplık kitaplıklarını oluşturun.
rm -rf $HOME/ssl
mkdir -p $HOME/ssl/bin
mkdir -p $HOME/ssl/include/openssl
mkdir -p $HOME/ssl/lib
cp $HOME/ssl-x86/openssl.cnf $HOME/ssl/openssl.cnf
cp $HOME/ssl-x86/include/openssl/* $HOME/ssl/include/openssl
cp $HOME/ssl-x86/include/openssl/opensslconf-x86.h $HOME/ssl/include/openssl/opensslconf-x86.h
cp $HOME/ssl-x64/include/openssl/opensslconf-x64.h $HOME/ssl/include/openssl/opensslconf-x64.h
cp $HOME/ssl-x86/include/openssl/bn-x86.h $HOME/ssl/include/openssl/bn-x86.h
cp $HOME/ssl-x64/include/openssl/bn-x64.h $HOME/ssl/include/openssl/bn-x64.h
Yeni <opensslconf.h>
bunu yapmadıysanız, $HOME/ssl/include/openssl/opensslconf.h
oluşturun. <bn.h>
$HOME/ssl/include/openssl/bn.h
oluştur
cat $HOME/ssl/include/openssl/opensslconf.h
#ifndef OPENSSL_MULTIARCH_CONF_HEADER
#define OPENSSL_MULTIARCH_CONF_HEADER
#if __i386 || __i386__
# include "opensslconf-x86.h"
#elif __x86_64 || __x86_64__ || __amd64 || __amd64__
# include "opensslconf-x64.h"
#else
# error Unknown architecture
#endif
#endif /* OPENSSL_MULTIARCH_CONF_HEADER */
Yeni: Yeni bir başlık bekçi (OPENSSL_MULTIARCH_CONF_HEADER
) kullandığından emin olun. Yeni bir başlık bekçi (OPENSSL_MULTIARCH_BN_HEADER
) kullandığından emin olun: Bu noktada
cat $HOME/ssl/include/openssl/bn.h
#ifndef OPENSSL_MULTIARCH_BN_HEADER
#define OPENSSL_MULTIARCH_BN_HEADER
#if __i386 || __i386__
# include "bn-x86.h"
#elif __x86_64 || __x86_64__ || __amd64 || __amd64__
# include "bn-x64.h"
#else
# error Unknown architecture
#endif
#endif /* OPENSSL_MULTIARCH_BN_HEADER */
Kütüphaneler
, sen $HOME/ssl-x86
bulunan kütüphanenin bir x86 yapı ve yer kütüphanenin bir x64 yapı var $HOME/ssl-x64
. Bunları $HOME/ssl
numaralı telefondan lipo
ile birleştirirsiniz.
ln -s $HOME/ssl/lib/libcrypto.dylib $HOME/ssl/lib/libcrypto.1.0.0.dylib
ln -s $HOME/ssl/lib/libssl.dylib $HOME/ssl/lib/libssl.1.0.0.dylib
: Eğer sembolik bağlantıları yeniden oluşturmanız gerekir, lipo -create $HOME/ssl-x86/lib/libcrypto.1.0.0.dylib \
$HOME/ssl-x64/lib/libcrypto.1.0.0.dylib \
-output $HOME/ssl/lib/libcrypto.1.0.0.dylib
lipo -create $HOME/ssl-x86/lib/libssl.1.0.0.dylib \
$HOME/ssl-x64/lib/libssl.1.0.0.dylib \
-output $HOME/ssl/lib/libssl.1.0.0.dylib
Ardından: Eğer shared
ile yapılandırılan Eğer
lipo -create $HOME/ssl-x86/lib/libcrypto.a \
$HOME/ssl-x64/lib/libcrypto.a \
-output $HOME/ssl/lib/libcrypto.a
lipo -create $HOME/ssl-x86/lib/libssl.a \
$HOME/ssl-x64/lib/libssl.a \
-output $HOME/ssl/lib/libssl.a
lipo -create $HOME/ssl-x86/bin/openssl \
$HOME/ssl-x64/bin/openssl \
-output $HOME/ssl/bin/openssl
Hisse Kütüphaneler
, o zaman gerçekleştirmek için gereken
Son olarak, şeyleri test edin.
ls $HOME/ssl/lib/
libcrypto.a libssl.a
lipo -info $HOME/ssl/lib/libcrypto.a
Architectures in the fat file: $HOME/ssl/lib/libcrypto.a are: i386 x86_64
lipo -info $HOME/ssl/lib/libssl.a
Architectures in the fat file: $HOME/ssl/lib/libssl.a are: i386 x86_64
Ve sonra bir test programı: doğrulama kütüphaneleri multiarch olan
#include <openssl/opensslconf.h>
#include <openssl/ssl.h>
int main(int argc, char* argv[])
{
SSL_library_init();
return 0;
}
Ve: Eğer OS X'te dinamik kütüphaneleri inşa durumda
$ clang -arch i386 -arch x86_64 -I $HOME/ssl/include test.c -o test.exe -L $HOME/ssl/lib -lssl -lcrypto
$ DYLD_LIBRARY_PATH=$HOME/ssl/lib; ./test.exe
$
DYLD_LIBRARY_PATH
kullanılırİstenirse
, olmayan multiarch yüklemeleri silebilirsiniz:
rm -rf $HOME/ssl-x86
rm -rf $HOME/ssl-x64
sayesinde çok. Harikasın! –