如何在OS x上使Boost dylibs通用(i386和x86_64)?
How to make Boost dylibs universal (i386 & x86_64) on os x?
>我正在尝试将 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编译它?
我也在为此苦苦挣扎。诀窍似乎是双重的。
- 您需要使用不同的
toolset
来构建 i386 .dylib。 无论我尝试过什么,clang
都会构建一个 x86_64 .dylib,但darwin
使用正确的标志将构建一个 i386 .dylib - 构建两次,一次用于 i386,一次用于 x86_64;然后使用
lipo
将结果组合成"fat".dylib
这是我快速拼凑在一起的内容,以可重复地获得"胖".dylibs。在通用/中找到您需要的那些。静态的"fat".a libs 保留在 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
相关文章:
- 为x86而非x64编译时出错
- C++如何仅使用MOV在x86上实现发布和获取
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 在 c++ 中使用 x86 DIV 的这个 asm 块有什么用?
- 在 x86 上实现 std::atomic_thread_fence(std::memory_order_seq_cst
- 如何将C++子例程链接到 x86 程序集程序?
- 如何在 x86 处理器上实现"锁定添加"
- 您选择的 CPU 不支持 x86-64 指令集
- mingw32_gt_pch_use_address中的内部错误,在config/i386/host-mingw32.c
- std::x86 上需要memory_order_acquire围栏吗?
- 尝试使用 x86 asm SSSE3 将大端转换为小端序
- 如何在 MSVC C++中迁移 x64 的 x86 代码
- 将内联程序集尾调用函数尾声替换为用于x86/x64 msvc的Intrinsics
- 将程序从x86转换为x64
- 如果由不同的线程写入 8 字节,那么现代英特尔 x86 上的 8 字节读取是否保证理智?
- 将vector<vector<double>>从x86平台中创建的一个进程发送到x64中构建的另一个进程的最快方法是什么
- x86 32位对Cuda的支持
- 这个x86汇编代码是如何接收和存储子程序返回的数据的
- Clang:x86 FPU调用约定