Я пытаюсь скомпилировать библиотеку Boost в универсальный двоичный файл (т. Е. «Толстый» файл, содержащий сборки для архитектур i386 и x86_64).
Скисание в интернете и ТАК Я собрал следующие инструкции.
Скачать Boost (например, из http://www.boost.org/users/download/)
В загруженной папке введите ./bootstrap.sh
(или, в моем случае ./bootstrap.sh --with-libraries=thread
, так как мне нужна только библиотека потоков)
тип ./b2 install cxxflags="-arch i386 -arch x86"
Эти шаги установили библиотеку потоков Boost для /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?
Я тоже боролся с этим. Уловка, кажется, двойная.
toolset
построить i386 .dylib. clang
построит x86_64 .dylib независимо от того, что я пытался, но darwin
с правильными флагами соберу i386 .dyliblipo
объединить результат в «жирный» .dylibВот то, что я быстро соединил, чтобы воспроизводимо получить «толстые» .dylibs. Найдите те, которые вам нужны в Universal /. Статические «жирные» .a библиотеки остаются в stage / 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
Других решений пока нет …