dB'*_*dB' 5 c++ boost boost-thread universal-binary osx-mountain-lion
我正在尝试将 Boost 库编译成通用二进制文件(即包含 i386 和 x86_64 架构的构建的“胖”文件)。
发酸互联网和SO我组装了以下说明。
下载 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
Run Code Online (Sandbox Code Playgroud)
然而,动态库似乎只针对 x86_64 进行了编译。
$ lipo -i /usr/local/lib/libboost_thread.dylib
Non-fat file: /usr/local/lib/libboost_thread.dylib is architecture: x86_64
Run Code Online (Sandbox Code Playgroud)
我也希望 .dylib 是通用的。有谁知道我如何为 i386 和 x86_64 编译它?
我也在为此苦苦挣扎。这个技巧似乎有两个方面。
toolset来构建 i386 .dylib。clang无论我尝试什么,都会构建一个 x86_64 .dylib,但是darwin使用正确的标志将构建一个 i386 .dyliblipo将结果组合成“胖”.dylib这是我快速拼凑起来以可重复地获得“胖”.dylibs 的内容。在 universal/ 中找到您需要的。静态“fat”.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
Run Code Online (Sandbox Code Playgroud)
单线:
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
Run Code Online (Sandbox Code Playgroud)