No template named 'unary_function' in namespace 'std'; did you mean '__unary_function'?
刚刚将我的 Xcode 升级到 15.0,突然它开始在 RCT_Folly 中出现以下错误
No template named 'unary_function' in namespace 'std'; did you mean '__unary_function'?
这一行出现故障:
struct hash_base : std::unary_function<T, std::size_t> {};
我尝试删除缓存数据和派生数据并清理构建。也尝试删除 pod 和 node_modules。但没有任何帮助。
在源文件中修复此问题之前,最好的选择是在 podfile 中添加已删除的 libcpp 函数,如此处解决的 https://github.com/facebook/react-native/issues/37748#issuecomment-1580589448
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', '_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION']
end
end
end
运行 npx react-native run-ios
后,我在终端中收到此错误。我通过以下步骤解决了它:
- 打开Xcode
- 单击播放图标启动模拟器
- 模拟器将失败,但 Xcode 会在侧边栏中显示错误。单击错误可以查看代码中的错误位置。
- 单击“Fix”按钮
- 完毕!现在模拟器就可以成功运行了。
这有点愚蠢,但我通过按照 XCode 的建议放置 __unary_function
来解决它。
所以实际的线路是..
struct hash_base : std::__unary_function<T, std::size_t> {};
所有库必须更新其代码以使用 std::function 和 std::bind 而不是 unary_function
解决方法
选择 Pod > Build Settings > 在“Apple Clang - Preprocessing”部分>“Macro”部分下
在 release & debug 添加 -> _LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION
ps:要添加此内容,只需单击该列,然后单击底部的“+”->然后粘贴:_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION
@Ash 是对的,我将我的 Xcode 和 iOS 版本更新到 17.0 一切 工作正常,但当我在 iOS 17 上运行它时,出现此错误。
No template named 'unary_function' in namespace 'std'; did you mean '__unary_function'
我按照提供的步骤修复它,应用程序开始运行。但是,当我打开正在使用的react-native-maps 时,它崩溃了。之后我删除了pod,重新安装了node 模块,但同样的问题仍然存在。令人惊讶的是,当我在 Podfile 中添加以下代码并重新安装 pod 时,应用程序开始正常运行。
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', '_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION']
end
end
end
如果您还有旧的 RN 版本,
这对我有用:
post_install do |installer|
react_native_post_install(installer)
__apply_Xcode_12_5_M1_post_install_workaround(installer)
installer.pods_project.build_configurations.each do |config|
installer.pods_project.targets.each do |target|
if target.respond_to?(:product_type) and target.product_type == "com.apple.product-type.bundle"
config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
end
end
# Set the preprocessing macro for the whole Pods project
existing_flags = config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)']
existing_flags << '_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION'
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = existing_flags
end
end
如果您可以控制编译标志,您有两个选择,
让 clang 重新启用已弃用的功能:
-D_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION
防止 Boost 使用已弃用的函数:
-DBOOST_NO_CXX98_FUNCTION_BASE
对于遇到此错误的任何 React Native 用户,Facebook 已在 v0.72.5 中发布了修复程序 - 发行说明。
XCode 15 修复(21763e85e3、0dbd621c59 和 8a5b2d6735)
npm update react-native