4

Я пытаюсь собрать библиотеку Boost в универсальный двоичный файл (т. Е. «Жирный» файл, содержащий сборки для архитектур i386 и x86_64).Как сделать Boost dylibs универсальным (i386 и x86_64) на os x?

Загрязнение Интернета и SO Я собрал следующие инструкции.

  1. Скачать импульс (например, от http://www.boost.org/users/download/)

  2. В скачанной папке, введите ./bootstrap.sh (или, в моем случае ./bootstrap.sh --with-libraries=thread, так как мне нужно только библиотеку потока)

  3. типа ./b2 install cxxflags="-arch i386 -arch x86"

Эти шаги устанавливают Boost threa d до /usr/local/lib/ (его стандартное расположение). Полученная статическая библиотека является универсальной бинарной. Все идет нормально.

$ lipo -i /usr/local/lib/libboost_thread.a 
Architectures in the fat file: /usr/local/lib/libboost_thread.a are: i386 x86_64 

Динамическая библиотека, однако, похоже, была скомпилирована для x86_64.

$ lipo -i /usr/local/lib/libboost_thread.dylib 
Non-fat file: /usr/local/lib/libboost_thread.dylib is architecture: x86_64 

Я бы хотел, чтобы .dylib был универсальным. Кто-нибудь знает, как я могу скомпилировать его для i386, а также x86_64?

ответ

2

Я тоже боролся с этим. Трюк кажется двояким.

  1. Для сборки i386 .dylib необходимо использовать другой toolset. clang построит x86_64 .dylib независимо от того, что я пробовал, но darwin с правильными флагами построит i386 .dylib
  2. Сборка дважды, один раз для i386, один раз для x86_64; затем использовать lipo объединить результат в «жира» .dylib

Вот что я быстро бросил вместе воспроизводимо получить .dylibs «жир». Найдите те, которые вам нужны в универсальном /. Статические «fat» .a libs остаются в стадии/lib /.

rm -rf i386 x86_64 universal 
./bootstrap.sh --with-toolset=clang --with-libraries=filesystem 
./b2 toolset=darwin -j8 address-model=32 architecture=x86 -a 
mkdir -p i386 && cp stage/lib/*.dylib i386 
./b2 toolset=clang -j8 cxxflags="-arch i386 -arch x86_64" -a 
mkdir x86_64 && cp stage/lib/*.dylib x86_64 
mkdir universal 
for dylib in i386/*; do 
    lipo -create -arch i386 $dylib -arch x86_64 x86_64/$(basename $dylib) -output universal/$(basename $dylib); 
done 

Однострочник:

rm -rf i386 x86_64 universal && ./bootstrap.sh --with-toolset=clang --with-libraries=filesystem && ./b2 toolset=darwin -j8 address-model=32 architecture=x86 -a && mkdir -p i386 && cp stage/lib/*.dylib i386 && ./b2 toolset=clang -j8 cxxflags="-arch i386 -arch x86_64" -a && mkdir x86_64 && cp stage/lib/*.dylib x86_64 && mkdir universal && for dylib in i386/*; do lipo -create -arch i386 $dylib -arch x86_64 x86_64/$(basename $dylib) -output universal/$(basename $dylib); done 
Смежные вопросы