MacOS Catalina编译Boost C++教程示例文件报错求助
解决MacOS Catalina下Boost编译cmath头文件符号缺失问题
我之前在Catalina上搞Boost开发时也踩过这个坑——就是Xcode在Catalina里移除了旧的SDK头文件修复包,导致编译时cmath找不到signbit、fpclassify这些全局命名空间的数学符号。下面给你几个Boost专属的解决办法,不用降级系统:
方法1:编译Boost时指定SDK路径并启用C++17标准
Catalina的SDK里这些符号其实是在std命名空间下的,而Boost的旧版本可能默认用了更老的标准。你可以在编译Boost的时候明确指定SDK路径和C++标准:
- 先确认你的Xcode SDK路径,一般是:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk - 进入Boost根目录,执行编译命令:
这样会强制Boost用C17标准编译,而C17规范要求这些数学符号归属./bootstrap.sh ./b2 macosx-version=10.15 cxxflags="-std=c++17 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk" linkflags="-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk"std命名空间,Boost代码会自动适配这个变化。
方法2:给Boost lambda库打局部补丁
如果只是编译lambda示例出问题,你可以手动修改Boost lambda相关头文件,把全局符号改为std命名空间下的版本:
- 找到Boost根目录下的
boost/lambda/detail文件夹,打开其中的numeric_limits.hpp文件 - 把所有用到
signbit、fpclassify的位置,前缀加上std:: - 重新编译你的
example.cpp,应该就能解决符号缺失的问题。
方法3:用Boost自带的bjam编译示例
直接用g++编译可能没带上Boost编译时的系统适配参数,改用bjam来编译会更顺畅:
- 在
example.cpp所在目录创建一个Jamfile,内容如下:exe example : example.cpp ; - 终端运行编译命令:
bjam会自动继承Boost编译时的系统适配配置,避免头文件符号的查找问题。bjam toolset=clang macosx-version=10.15 cxxflags="-std=c++17"
额外提示
你用的是Boost 1.71.0,这个版本已经开始适配C++17和Catalina SDK,所以方法1应该是最省心的。如果还是有问题,可以尝试升级到Boost 1.75及以上版本,新版本对Catalina的兼容性会更好。
内容的提问来源于stack exchange,提问作者Bhargav Varshney
相关产品推荐
相关产品推荐

