如何在os x上制作Boost dylibs通用(i386& x86_64)?

时间:2013-11-11 02:02:54

标签: c++ boost osx-mountain-lion boost-thread universal-binary

我正在尝试将Boost库编译为通用二进制文件(即包含i386和x86_64架构构建的“胖”文件)。

互联网和SO我收集了以下说明。

  1. 下载提升(例如来自http://www.boost.org/users/download/

  2. 在下载的文件夹中,输入./bootstrap.sh (或者,在我的情况下./bootstrap.sh --with-libraries=thread,因为我只需要线程库)

  3. 输入./b2 install cxxflags="-arch i386 -arch x86"

  4. 这些步骤将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 个答案:

答案 0 :(得分:2)

我也在努力解决这个问题。诀窍似乎是双重的。

  1. 您需要使用不同的toolset来构建i386 .dylib。无论我尝试过什么,clang都会构建一个x86_64 .dylib,但带有正确标志的darwin将构建一个i386 .dylib
  2. 构建两次,一次用于i386,一次用于x86_64;然后使用lipo将结果合并为“fat”.dylib
  3. 这是我快速拼凑到可重复地获得'胖'.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