如何在 os x 上使 Boost dylibs 通用(i386 和 x86_64)?
Posted
技术标签:
【中文标题】如何在 os x 上使 Boost dylibs 通用(i386 和 x86_64)?【英文标题】:How to make Boost dylibs universal (i386 & x86_64) on os x? 【发布时间】:2013-11-22 17:56:29 【问题描述】:我正在尝试将 Boost 库编译为通用二进制文件(即包含 i386 和 x86_64 架构的构建的“胖”文件)。
上网和SO 我组装了以下说明。
下载提升(例如来自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 编译它?
【问题讨论】:
【参考方案1】:我也在为此苦苦挣扎。诀窍似乎有两个方面。
-
您需要使用不同的
toolset
来构建 i386 .dylib。 clang
将构建一个 x86_64 .dylib 无论我尝试什么,但 darwin
使用正确的标志将构建一个 i386 .dylib
构建两次,一次用于 i386,一次用于 x86_64;然后使用lipo
将结果组合成一个“胖”的.dylib
这是我快速拼凑起来的内容,可重现地获得“胖”.dylib。在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
单线:
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
【讨论】:
以上是关于如何在 os x 上使 Boost dylibs 通用(i386 和 x86_64)?的主要内容,如果未能解决你的问题,请参考以下文章
如何解决 OS X 上 libobjc.A.dylib 造成的的内存泄露问题
第40月第20天 在Mac OS X上.dylib和.so之间的区别
install_name_tool 更新可执行文件以在 Mac OS X 中搜索 dylib
Homebrew OS X OpenCV - 在另一台 Mac 上运行时寻找 dylib
Mac OS X查看二进制可执行文件引用的动态链接库(otool –L xxxx.dylib)
未加载库:尝试使用 mysql2 gem 在 OS X 10.6 上运行“rails server”时出现 libmysqlclient.16.dylib 错误