Xcode报错:'atomic_notify_one<unsigned long>'不可用。

109
我在我的Mac上安装了Xcode 12,试图构建一个在安卓上运行完美的React Native应用程序,可是出现了错误'atomic_notify_one<unsigned long>' is unavailable。这是我从错误信息中获得的大部分信息。
14个回答

172

这里提供一种对flipper不进行注释的解决方案,我已经验证可行。

请将Podfile中的flipper更新为以下内容:

use_flipper!({ 'Flipper-Folly' => '2.5.3', 'Flipper' => '0.87.0', 'Flipper-RSocket' => '1.3.1' })

在ios文件夹内运行pod repo update命令

最后,使用pod install命令更新您的项目依赖库


1
非常感谢,这对我来说完全可行,而且没有牺牲翻转器。谢谢。 - Víctor Ramírez
2
太好了,谢谢。至少iOS开发没有任何不必要的复杂性。 - karfus
2
这个设置对我在xCode 13.0上有效:use_flipper!({ 'Flipper' => '0.96.0', 'Flipper-Folly' => '~> 2.6', 'Flipper-RSocket' => '~> 1.4' }) - Hossein Rashno
在哪里添加这行代码? - Faiz Ul Hassan
@FaizUlHassan 在 permissions_path 部分之后。 - ThinkAndCode
这并没有解决我的问题。花了几个小时,但最终 这个链接 对我有所帮助(每一步都很重要)。 - Dror Bar

41

今天在iOS模拟器升级到iOS 14.5后,这个问题又发生了。 "Shared S Katre" 发布的答案似乎是一个不错的解决方法。

因为React-Native是开源代码,我认为iOS上的任何大更新都可能带来破坏性变化。我想这些问题以后会被修复。

无论如何-此问题似乎与Flipper有关,Flipper是RN的调试工具 (https://reactnative.dev/blog/2020/03/26/version-0.62)。

如果您只需要让项目构建,请在您的podfile中将flipper注释掉,然后像这样重新安装您的pods。

Podfile

# Enables Flipper.
#
# Note that if you have use_frameworks! enabled, Flipper will not work and
# you should disable the next line.
# use_flipper!()

接下来,重新安装你的Pods。我进入项目的根目录并使用了npx。

$ npx pod-install

最后,尝试构建并运行您的项目:

$ npx react-native run-ios

更新:

根据评论,看起来现在已经修复了。如果你想要 Flipper,请能够还原你的 Podfile 并更新 Flipper。

参见:https://dev59.com/9VEG5IYBdhLWcg3wbNTX#67314652

感谢 Stackers!


1
这是来自Flipper的相关GitHub问题 - 看起来他们正在努力尽快找到解决方案。https://github.com/facebook/flipper/issues/2215 - chrisheninger
1
现在有一个可用的补丁,使用flipper -folly 2.5.3即可。 https://github.com/facebook/flipper/issues/2215#issuecomment-828815200 - lonecruisader

22
  1. 按照下图所示修改Podfile文件 enter image description here
  2. 进入ios目录
  3. 删除Pods文件夹和Podfile.lock文件
  4. 运行命令"pod install"
  5. 更新已安装的库,运行命令"pod update"
  6. 回到上级目录后,运行命令"npx react-native run-ios"以启动iOS应用

2
我认为这不是最好的解决方案,因为其他人可能正在使用Flipper开发工具。这个解决方案更好,因为它更新了库以包含上游修复:https://dev59.com/9VEG5IYBdhLWcg3wbNTX#66876338 - Jules

17

如果有人仍然遇到这个错误(我刚刚更新了Mac,Xcode等等),你可以在不禁用Flipper和Hermes的情况下修复构建;在您的Pod文件中的post_install下添加以下内容(我在网上找到它并更改以修复最新更新的新错误):

post_install do |installer|
    flipper_post_install(installer)
    react_native_post_install(installer)

    # # to build for the simulator on Apple M1
    # installer.pods_project.targets.each do |target|
    #   target.build_configurations.each do |config|
    #     # disables arm64 builds for the simulator
    #     config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64'
    #   end
    # end

    ## Fix for XCode 12.5 & RN 0.62.2 - See https://github.com/facebook/react-native/issues/28405
    find_and_replace("../node_modules/react-native/React/CxxBridge/RCTCxxBridge.mm",
      "_initializeModules:(NSArray<id<RCTBridgeModule>> *)modules", "_initializeModules:(NSArray<Class> *)modules")

    find_and_replace("../node_modules/react-native/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm",
      "RCTBridgeModuleNameForClass(strongModule))", "RCTBridgeModuleNameForClass(Class(strongModule)))")

    ## Fix for Flipper-Folly on iOS 14.5
    find_and_replace("Pods/Flipper-Folly/folly/synchronization/DistributedMutex-inl.h",
      "atomic_notify_one(state)", "folly::atomic_notify_one(state)")

    find_and_replace("Pods/Headers/Private/RCT-Folly/folly/synchronization/DistributedMutex-inl.h",
      "atomic_notify_one(state)", "folly::atomic_notify_one(state)")

    find_and_replace("Pods/Flipper-Folly/folly/synchronization/DistributedMutex-inl.h",
      "atomic_wait_until(&state, previous | data, deadline)", "folly::atomic_wait_until(&state, previous | data, deadline)")
  end

在你的目标之前,添加。
# fixes for last Mac updates
def find_and_replace(dir, findstr, replacestr)
  Dir[dir].each do |name|
      text = File.read(name)
      replace = text.gsub(findstr,replacestr)
      if text != replace
          puts "Fix: " + name
          File.open(name, "w") { |file| file.puts replace }
          STDOUT.flush
      end
  end
  Dir[dir + '*/'].each(&method(:find_and_replace))
end

10
如果出现错误 Permission denied @ rb_sysopen - Pods/Flipper-Folly/folly/synchronization/DistributedMutex-inl.h,则删除Pods文件夹可以解决这个问题。 - Stathis Ntonas
1
只有这个对我有效!谢谢!在运行pod-install之前删除Pods文件。 - Fatih Taşdemir
1
5月19日起,不再需要底部的3个替换操作,只需保留“## 修复iOS 14.5上Flipper-Folly问题”的注释前的前两个find_and_replace调用。 - f4z3k4s
我遇到了这个错误:undefined method `flipper_post_install' for #<Pod::Podfile: - salvi shahzad

13

我需要在AppDelegate.m中注释所有的#ifdef FB_SONARKIT_ENABLED,将hermes设置为false并在Podfile中注释Flipper。

最后,删除Pods和Podfile.lock,然后运行pod install。


6
你建议禁用Hermes :hermes_enabled => false 是我所缺少的,以便让它正常工作。希望很快会有更新。谢谢! - Allen
我之前设置了 :hermes_enabled => true,但后来需要将其改为 :hermes_enabled => false。然后我执行了 pod install --update-repo 命令,问题得到了解决。谢谢。 - Dror Bar

9

刚刚注释掉这一行就解决了这个问题 -

  # use_flipper!
  # post_install do |installer|
  #   flipper_post_install(installer)
  # end

8

这个错误是来自Flipper。Flipper抛出了几个不太具描述性的错误,我不得不在我的podfile上进行注释。注释后,这个错误停止了。


4
是的,它可以在没有Flipper的情况下工作,并且我能够调试它,那么在React Native中Flipper的用途是什么? - Khurshid Ansari
2
@KhurshidAnsari 这并不是必需的。它基本上是一组调试工具,如日志查看器、堆栈跟踪查找器。 - Rahul Purohit

7

在使用Xcode 12.5进行编译时,我遇到了相同的问题。如果临时禁用Flipper不是您的选择,您可以降级至XCode 12.4。这个方法对我起了作用。您可以在此处下载Xcode 12.4:https://developer.apple.com/download/more


嗨@benoit,你的解决方案是唯一一个在不更改任何代码或依赖项的情况下正常工作的。即使修复了错误,Xcode 12.5仍然会连续显示许多错误,但降级到Xcode 12.4后,能够运行应用程序而无需进行任何更改。非常感谢你提供的这个精彩建议。 - Mohit Kale

6

稍微扩展一下Umang和opensw的回答。

我已经更新了find_and_replace,如下所示。请注意,我添加了system("chmod +w " + name),以解决Permission denied @ rb_sysopen错误。

def find_and_replace(dir, findstr, replacestr)
  Dir[dir].each do |name|
      text = File.read(name)
      replace = text.gsub(findstr,replacestr)

      if text != replace
          puts "Fix: " + name
          system("chmod +w " + name)
          File.open(name, "w") { |file| file.puts replace }
          STDOUT.flush
      end
  end
  Dir[dir + '*/'].each(&method(:find_and_replace))
end

这是我的翻页器配置

use_flipper!({ 'Flipper' => '0.87.0', 'Flipper-Folly' => '2.5.3', 'Flipper-RSocket' => '1.3.1' })

关于修复文件,在我的情况下,对于截至4月30日最新版本,仅在一个地方更新DistributedMutex-inl.h就足够了。

另外,请注意我在函数名之前添加了两个额外的空格符号。这是必要的,以便在后续调用中,pod install不会破坏代码。

  post_install do |installer|
    flipper_post_install(installer)
    react_native_post_install(installer)

    find_and_replace("Pods/RCT-Folly/folly/synchronization/DistributedMutex-inl.h",
          "  atomic_notify_one(state);", "  folly::atomic_notify_one(state);")
  end


1
这对我在Expo 44和Xcode 13.4.1上有效。谢谢 :) - Alexandre

5
将您的Podfile中所有当前的Flipper代码替换为以下代码,根据您的React Native版本进行选择:
add_flipper_pods!({ 'Flipper-Folly' => '2.5.3', 'Flipper' => '0.87.0', 'Flipper-RSocket' => '1.3.1' })

或者
use_flipper!({ 'Flipper-Folly' => '2.5.3', 'Flipper' => '0.87.0', 'Flipper-RSocket' => '1.3.1' })

然后使用以下内容更新Pods项目:

cd ios && pod install && cd ..

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接