Xcode 抛出“atomic_notify_one<unsigned long>”不可用

Mar*_*chi 83 react-native react-native-ios xcode12beta6

我在 Mac 上安装了 Xcode 12,尝试构建在 android 上完美运行的 React Native 应用程序,并获得'atomic_notify_one<unsigned long>' is unavailable. 这是我从错误中获得的最多信息。

kab*_*ius 137

这里没有注释掉鳍状肢,而是一个对我有用的解决方案。

将 Podfile 中的鳍状肢更新为如下所示

use_flipper!({ 'Flipper-Folly' => '2.5.3', 'Flipper' => '0.87.0', 'Flipper-RSocket' => '1.3.1' })
Run Code Online (Sandbox Code Playgroud)

pod repo update在 ios 文件夹中运行

最后,使用

pod install

  • 和......为什么这有效? (3认同)
  • 这真是一种享受,谢谢。至少iOS开发没有充满不必要的复杂性什么的。 (2认同)
  • 此设置适用于 xCode 13.0 : `use_flipper!({ 'Flipper' =&gt; '0.96.0', 'Flipper-Folly' =&gt; '~&gt; 2.6', 'Flipper-RSocket' =&gt; '~&gt; 1.4' })` (2认同)

cy-*_*y-c 38

今天iOS模拟器更新到iOS 14.5后,这个问题又出现了。“Shared S Katre”发布的答案似乎是一个很好的解决方法。

因为 React-Native 是开源代码,我认为 iOS 上的任何大更新肯定会带来突破性的变化。我想这些将在以后修复。

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

如果你只需要构建你的项目,你可以简单地在你的 podfile 中注释掉flipper,然后像这样重新安装你的pod。

播客文件

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

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

$ npx pod-install
Run Code Online (Sandbox Code Playgroud)

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

$ npx react-native run-ios
Run Code Online (Sandbox Code Playgroud)

更新:

根据评论,看起来现在已经修复了。如果你想要鳍状肢,你应该能够恢复你的 Podfile 并更新鳍状肢。

参见:https : //stackoverflow.com/a/67314652/9906042

感谢堆垛机!


小智 20

  1. 修复 Podfile 如下图所示 在此处输入图片说明
  2. 光盘
  3. 删除 Pods 文件夹和 Podfile.lock
  4. 吊舱安装
  5. 豆荚更新
  6. cd .. && npx react-native run-ios

  • 我认为这不是最好的解决方案,因为其他人可能正在使用 Flipper 开发工具。该解决方案更好,因为它更新了库以包含上游修复:/sf/answers/4681343691/ (2认同)

小智 12

我必须#ifdef FB_SONARKIT_ENABLED在 AppDelegate.m 中评论所有内容,将 hermes 设置为 false 并在 Podfile 中评论 Flipper。

毕竟删除Pods和Podfile.lock,然后pod install

  • 您禁用 Hermes `:hermes_enabled =&gt; false` 的建议是我为了开始工作而缺少的。希望更新很快就会出现。谢谢! (6认同)

ope*_*nsw 12

如果有人仍然出现此错误(我刚刚更新了 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
Run Code Online (Sandbox Code Playgroud)

在您的 之前target,添加

# 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
Run Code Online (Sandbox Code Playgroud)

  • 如果上面抛出错误“Permission returned @ rb_sysopen - Pods/Flipper-Folly/folly/synchronization/DistributedMutex-inl.h”,则删除“Pods”文件夹可修复该问题 (6认同)

Mar*_*chi 8

此错误是鳍状肢的错误。Flipper 抛出了更多描述性较低的错误,我不得不在我的 podfile 中对其进行评论。评论后,这个错误停止了。

  • 是的,它可以在没有 Flipper 的情况下工作,我可以对其进行调试,那么 Flipper 在 React Native 中有何用处? (3认同)
  • @KhurshidAnsari 这是没有必要的。它基本上是一组调试工具,例如日志查看器、堆栈跟踪查找器 (2认同)

小智 8

刚刚评论了这一行并解决了这个问题-

  # use_flipper!
  # post_install do |installer|
  #   flipper_post_install(installer)
  # end
Run Code Online (Sandbox Code Playgroud)


小智 6

在 XCode 12.5 中构建时我遇到了同样的问题。如果暂时禁用 Flipper 不适合您,您可以降级到 XCode 12.4。这为我修好了。你可以在这里下载 XCode 12.4:https : //developer.apple.com/download/more


Vla*_*ler 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
Run Code Online (Sandbox Code Playgroud)

这是我的鳍状肢配置

use_flipper!({ 'Flipper' => '0.87.0', 'Flipper-Folly' => '2.5.3', 'Flipper-RSocket' => '1.3.1' })
Run Code Online (Sandbox Code Playgroud)

至于修复文件,就我而言,在 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

Run Code Online (Sandbox Code Playgroud)


小智 5

我认为@opensw 提供的答案会起作用,但我找到了一些更强大的解决方案,以便它每次都可以与 pod install 一起使用,而不会删除Pods文件夹。首先,在您的 Podfile 中更改添加/替换这一行

use_flipper!({ 'Flipper-Folly' => '2.5.3', 'Flipper' => '0.87.0', 'Flipper-RSocket' => '1.3.1' })
Run Code Online (Sandbox Code Playgroud)

现在在上面几行中提到的最新版本中修复了一个问题,Flipper-folly 但是我们还需要处理 RCT-folly,为此,我们将使用该find_and_replace功能。这是我从这里得到的新功能

# Define find-and-replace function
  def find_and_replace(dir, findstr, replacestr)
    Dir[dir].each do |name|
        text = File.read(name)
        replace = text.gsub(findstr,replacestr)
        replaced = text.index(replacestr)
        if replaced == nil && 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
Run Code Online (Sandbox Code Playgroud)

现在从安装后调用这个函数,所以我们需要在里面添加以下 2 个函数调用 post_install do |installer|

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

  find_and_replace("Pods/RCT-Folly/folly/synchronization/DistributedMutex-inl.h",
  "atomic_wait_until(&state, previous | data, deadline)", "folly::atomic_wait_until(&state, previous | data, deadline)")
Run Code Online (Sandbox Code Playgroud)

这是我在Github 上的回答


小智 5

根据您的 React Native 版本,将 Podfile 中所有当前的 Flipper 代码替换为以下代码:

add_flipper_pods!({ 'Flipper-Folly' => '2.5.3', 'Flipper' => '0.87.0', 'Flipper-RSocket' => '1.3.1' })
Run Code Online (Sandbox Code Playgroud)

或者

use_flipper!({ 'Flipper-Folly' => '2.5.3', 'Flipper' => '0.87.0', 'Flipper-RSocket' => '1.3.1' })
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令更新 Pods 项目:

cd ios && pod install && cd ..
Run Code Online (Sandbox Code Playgroud)