我正在尝试在 MacOS 上将 boost 库构建为 dylib。我需要为 Intel 架构和即将推出的 Apple Silicon (arm64) 架构构建它。
我下载了 boost 并运行了以下命令:
./bootstrap.sh
./b2 -address-model=64 architecture=combined -a
lipo -archs
始终显示生成的 dylibs 架构是 x86_64
。
我有 Xcode12 beta 和 MacOS Catalina 10.15.7,
如果我在 Xcode 中创建一个项目并在构建设置中设置
archs arm64 x86_64
,我可以构建一个示例通用库。
运行命令
./b2 cxxflags="-arch arm64 -arch x86_64"
失败并出现以下错误:
"clang++" -x c++ -fvisibility-inlines-hidden -m64 -O3 -Wall -fvisibility=hidden -Wno-inline -arch arm64 -arch x86_64 -ftemplate-depth-255 -fvisibility=hidden -fvisibility-inlines-hidden -DBOOST_ALL_NO_LIB=1 -DNDEBUG -I"." -c -o "bin.v2/libs/serialization/build/clang-darwin-12.0/release/link-static/threading-multi/visibility-hidden/polymorphic_xml_iarchive.o" "libs/serialization/src/polymorphic_xml_iarchive.cpp"
...failed clang-darwin.compile.c++ bin.v2/libs/serialization/build/clang-darwin-12.0/release/link-static/threading-multi/visibility-hidden/polymorphic_xml_iarchive.o...
clang-darwin.compile.c++ bin.v2/libs/serialization/build/clang-darwin-12.0/release/link-static/threading-multi/visibility-hidden/polymorphic_xml_oarchive.o
In file included from libs/serialization/src/polymorphic_xml_oarchive.cpp:16:
In file included from ./boost/serialization/config.hpp:18:
In file included from ./boost/config.hpp:57:
In file included from ./boost/config/platform/macos.hpp:28:
In file included from ./boost/config/detail/posix_features.hpp:18:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/unistd.h:71:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/_types.h:27:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:32:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/cdefs.h:807:2: error: Unsupported architecture
#error Unsupported architecture
^
In file included from libs/serialization/src/polymorphic_xml_oarchive.cpp:16:
In file included from ./boost/serialization/config.hpp:18:
In file included from ./boost/config.hpp:57:
In file included from ./boost/config/platform/macos.hpp:28:
In file included from ./boost/config/detail/posix_features.hpp:18:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/unistd.h:71:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/_types.h:27:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:33:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/machine/_types.h:34:2: error: architecture not supported
#error architecture not supported
^
In file included from libs/serialization/src/polymorphic_xml_oarchive.cpp:16:
In file included from ./boost/serialization/config.hpp:18:
In file included from ./boost/config.hpp:57:
In file included from ./boost/config/platform/macos.hpp:28:
In file included from ./boost/config/detail/posix_features.hpp:18:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/unistd.h:71:
In file included from /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/_types.h:27:
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:55:9: error: unknown type name '__int64_t'
typedef __int64_t __darwin_blkcnt_t; /* total blocks */
^
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:56:9: error: unknown type name '__int32_t'; did you mean '__int128_t'?
typedef __int32_t __darwin_blksize_t; /* preferred block size */
^
note: '__int128_t' declared here
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:57:9: error: unknown type name '__int32_t'; did you mean '__int128_t'?
typedef __int32_t __darwin_dev_t; /* dev_t */
^
note: '__int128_t' declared here
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:60:9: error: unknown type name '__uint32_t'; did you mean '__uint128_t'?
typedef __uint32_t __darwin_gid_t; /* [???] process and group IDs */
^
note: '__uint128_t' declared here
/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/sys/_types.h:61:9: error: unknown type name '__uint32_t'; did you mean '__uint128_t'?
typedef __uint32_t __darwin_id_t; /* [XSI] pid_t, uid_t, or gid_t*/
^
我在蒙特利,使用 M1(XCode 13.1),未能获得任何其他工作答案,但我将 Navan 和 Petr 的内容与其他一些位结合起来,以使 libboost_coroutine 在 x86_64 上工作。 我得到了以下脚本,它构建了所有的 boost 库(为什么不呢,在 M1 上不需要很长时间):
#!/bin/sh
rm -rf arm64 x86_64 universal stage bin.v2
rm -f b2 project-config*
./bootstrap.sh cxxflags="-arch x86_64 -arch arm64" cflags="-arch x86_64 -arch arm64" linkflags="-arch x86_64 -arch arm64"
./b2 toolset=clang-darwin target-os=darwin architecture=arm abi=aapcs cxxflags="-arch arm64" cflags="-arch arm64" linkflags="-arch arm64" -a
mkdir -p arm64 && cp stage/lib/*.dylib arm64
./b2 toolset=clang-darwin target-os=darwin architecture=x86 cxxflags="-arch x86_64" cflags="-arch x86_64" linkflags="-arch x86_64" abi=sysv binary-format=mach-o -a
mkdir x86_64 && cp stage/lib/*.dylib x86_64
mkdir universal
for dylib in arm64/*; do
lipo -create -arch arm64 $dylib -arch x86_64 x86_64/$(basename $dylib) -output universal/$(basename $dylib);
done
for dylib in universal/*; do
lipo $dylib -info;
done
此脚本打印出
universal
目录中每个 dylib 的 lipo 信息,因此您可以快速看到每个 dylib 内部都有 x86_64 和 arm64。 我得到了以下结果,也许对您查看输出是否匹配很有用:
Architectures in the fat file: universal/libboost_atomic.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_chrono.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_container.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_context.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_contract.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_coroutine.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_date_time.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_filesystem.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_graph.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_iostreams.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_locale.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_log.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_log_setup.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_numpy27.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_prg_exec_monitor.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_program_options.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_python27.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_random.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_regex.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_serialization.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_stacktrace_addr2line.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_stacktrace_basic.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_stacktrace_noop.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_system.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_thread.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_timer.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_type_erasure.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_unit_test_framework.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_wave.dylib are: x86_64 arm64
Architectures in the fat file: universal/libboost_wserialization.dylib are: x86_64 arm64
以下内容适用于我在 Big Sur 上使用 Xcode 12.2 的情况。在 Catalina 10.15.7 (19H15) 上,我收到与 OP 相同的错误消息。
./bootstrap.sh --with-libraries=regex,date_time
./b2 architecture=combined cxxflags="-arch x86_64 -arch arm64"
在这里花费了大量时间之后:
我能够在arm64上编译boost。命令行是:
./b2 架构=arm 地址模型=64 asmflags=--target=arm64-apple-darwin21.2.0 cflags=--target=arm64-apple-darwin21.2.0 cxxflags=--target=arm64-apple-darwin21。 2.0 linkflags=--target=arm64-apple-darwin21.2.0 -s NO_LZMA=1 -s NO_ZSTD=1 abi=aapcs
LZMA 和 ZSTD 标志在那里,因为我的机器上没有这些库的通用二进制文件。
我面临着同样的问题,并遇到了这个answer,它用于为 i386 和 x86_64 创建通用二进制文件。
总结一下答案,您需要运行
./b2
两次(使用不同的工具集,因为 clang 始终为 x86_64 构建,即使您传递了适当的 CXXFlags
这是我用来首先单独生成我需要的库,然后使用
lipo
组合它们的脚本
#!/bin/sh
rm -rf arm64 x86_64 universal
./bootstrap.sh --with-toolset=clang --with-libraries=thread,system,filesystem,program_options,serialization
./b2 cxxflags="-arch arm64" toolset=darwin -a
mkdir -p arm64 && cp stage/lib/*.dylib arm64
./b2 toolset=clang cxxflags="-arch arm64 -arch x86_64" -a
mkdir x86_64 && cp stage/lib/*.dylib x86_64
mkdir universal
for dylib in arm64/*; do
lipo -create -arch arm64 $dylib -arch x86_64 x86_64/$(basename $dylib) -output universal/$(basename $dylib);
done
我遵循了 Navan Chauhan 的答案,这似乎是在 macOS 10.15.7 上使用 Xcode 12.3 的方法。
我唯一的问题是构建系统添加了额外的
-arch armv4t
clang 选项(或类似的选项),导致构建失败。使用 architecture=combine
无法正常工作,它只能管理 Intel 和 PowerPC。对我有用的是:
bootstrap.sh --with-toolset=clang-darwin
和 cxxflags
、cflags
和 linkflags
设置为 -arch x86_64 -arch arm64
加上其他选项。b2 toolset=clang-darwin target-os=darwin architecture=x86 stage
和 cxxflags
、cflags
和 linkflags
仅设置为 -arch x86_64
(加上其他选项)。b2 toolset=clang-darwin target-os=darwin architecture=arm abi=aapcs stage
和 cxxflags
、cflags
和 linkflags
仅设置为 -arch arm64
(加上其他选项)。lipo
...我也被迫设置 ABI,因为“自动猜测某些东西”无法识别 Apple Silicon 目标,因此某些汇编内容未编译 - 因此在构建过程中会出现“丢失符号”。最后,armv4t
问题通过clang-darwin
工具集解决了。
user-config.jam
或在每个 install
之后立即调用
stage
来解决,这就是我所做的。 适用于:
主机平台:IntelmacOS 10.15.7
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
我在 boost 1.78 上尝试了该脚本,但豪华轿车阶段失败:
lipo: specifed architecture type (arm64) for file (arm64/libboost_atomic.dylib) does not match its cputype (16777223) and cpusubtype (3) (should be cputype (16777228) and cpusubtype (0))
这似乎确实是错误的:
#file arm64/libboost_wserialization.dylib arm64/libboost_wserialization.dylib: Mach-O 64-bit dynamically linked shared library x86_64
线索?
我需要使用 CMake。而 ABI 则有点令人困惑。基于 Boost/CMake 文档
1BOOST_CONTEXT_ARCHITECTURE=combined
在内部2,它似乎包括
arm64
的AAPCS和x86_64
的sysv。
检查了 macOS M1 构建 boost 1.82.0,成功构建了包含两种架构的胖二进制文件:
要在系统范围内安装:
sudo ./b2 -a address-model=64 architecture=arm+x86 install
检查是否链接成功。请随时确认:
lipo -info /usr/local/lib/libboost_chrono.dylib
Architectures in the fat file: /usr/local/lib/libboost_chrono.dylib are: x86_64 arm64
希望有帮助。