Мне нужно построить OpenSSL в OS X для 32-разрядных и 64-разрядных архитектур. Каковы параметры, которые мне нужно предоставить для ./Configure
, так что я получаю его для обеих архитектур в один и тот же файл .a?Build Multiarch OpenSSL на OS X
ответ
./Конфигурируйте, чтобы я построил его для обеих архитектур в один и тот же файл .a?
Вы должны быть осторожны с библиотеками OpenSSL и multiarch, потому что библиотека не является многоархивой. Это связано с тем, что каждая конфигурация имеет свой собственный файл <openssl/opensslconf.h>
, и каждая из платформ BIGNUM
отличается.
Поставка -arch x86_64 -arch i386
приведет к сбою сборки из-за того, что команды сборки OpenSSL формируют команды. Также см. Getting libcrypto ar error while compiling OpenSSL for Mac.
Та же самая процедура, описанная ниже, относится также к iOS. Единственное, что меняется, это -arch
. Для iOS вы, вероятно, используете armv7
, armv7s
, arm64
и i386
(для отладки 32-разрядных симуляторов) и x86_64
(для отладки 64-битного симулятора).
Существует еще один не столь очевидный трюк. OpenSSL жестко кодирует некоторые пути по умолчанию на основе --prefix
и --openssldir
, поэтому вам необходимо создать 32-разрядный каталог установки, установить, а затем переместить его; затем создайте 64-битный каталог установки, установите, а затем переместите его; а затем создайте жирную библиотеку в каталоге установки. Также см How to determine the default location for openssl.cnf?
Наконец, не заменить OS X поставляемого OpenSSL. OpenSSL 1.0.x и 1.1.x - это , а не, бинарный, совместимый с версией OpenSSL от Apple 0.9.8. Из-за несовместимости в приведенных ниже процедурах используется $HOME/ssl
. Вы можете использовать /usr/local/ssl
или любое другое место, которое соответствует вашему вкусу.
Перед тем, как начать, OpenSSL вики имеет страницу на Compilation and Installation. Существует множество вариантов для поставки config
. Выберите те, которые соответствуют вашему вкусу. Я всегда использую no-ssl2
и обычно использую no-ssl3
, no-comp
. На мобильных устройствах я использую no-srp
, no-psk
, no-hw
, no-dso
и no-engines
.
Вот инструкции по созданию библиотеки. Вы будете настраивать, создавать, устанавливать и затем перемещать для каждой архитектуры, которую вы поддерживаете в своей сборке многоархивов.
32-битный
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-битный
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
Headers
Вам нужно скопировать один набор заголовков (это не имеет значения, какой) , копия opensslconf-x86.h
, opensslconf-x64.h
bn-x86.h
и bn-x64.h
, создайте новый <openssl/opensslconf.h>
, создайте новый <openssl/bn.h>
и, наконец, создайте многоархивные библиотеки.
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
Новый <opensslconf.h>
Если вы еще не сделали этого, создать $HOME/ssl/include/openssl/opensslconf.h
. Убедитесь, что вы используете новый охранник заголовка (OPENSSL_MULTIARCH_CONF_HEADER
):
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 */
Новый <bn.h>
Создать $HOME/ssl/include/openssl/bn.h
. Убедитесь, что вы используете новый охранник заголовка (OPENSSL_MULTIARCH_BN_HEADER
):
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 */
Библиотеки
На данный момент, у вас есть x86 сборка библиотеки, расположенной на $HOME/ssl-x86
и x64 сборки библиотеки, расположенной в $HOME/ssl-x64
. Вы объединяете их с lipo
по адресу $HOME/ssl
.
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
Share Библиотеки
Если вы настроены shared
, то вам необходимо выполнить:
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
Затем вам нужно воссоздать softlinks:
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
Наконец, проверьте вещи. Убедитесь, что библиотеки мультиархитектурная:
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
А потом тестовая программа:
#include <openssl/opensslconf.h>
#include <openssl/ssl.h>
int main(int argc, char* argv[])
{
SSL_library_init();
return 0;
}
И:
$ 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
используется в случае, если вы построили динамические библиотеки на OS X.
При желании, можно удалить без мультиархитектурная установки:
rm -rf $HOME/ssl-x86
rm -rf $HOME/ssl-x64
спасибо большое. Ты жжешь! –