Xcode выбрасывает 'atomic_notify_one <unsigned long>' недоступен

Я установил Xcode 12 на свой Mac, попытался создать собственное приложение для реагирования, которое отлично работает на Android, и получил 'atomic_notify_one<unsigned long>' is unavailable. Это большая часть информации, которую я получаю от ошибки.

15 ответов

Решение

Это ошибка от flipper. Флиппер выдал еще несколько менее описательных ошибок, которые мне пришлось прокомментировать в моем подфайле. После комментирования эта ошибка прекратилась.

Вместо того, чтобы комментировать флиппер, вот решение, которое сработало для меня.

Обновите флиппер в своем подфиле, чтобы он выглядел так

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

Запустить pod repo update внутри папки ios

И, наконец, обновите модули проекта, используя

pod install

Эта проблема повторилась сегодня после обновления симуляторов iOS до iOS 14.5. Ответ, отправленный «Shared S Katre», кажется хорошим решением.

Поскольку React-Native - это открытый исходный код, я думаю, что любые большие обновления iOS определенно могут привести к критическим изменениям. Думаю, это будет исправлено позже.

В любом случае - проблема, похоже, связана с Flipper, который служит инструментом отладки для RN ​​(https://reactnative.dev/blog/2020/03/26/version-0.62).

Если вам просто нужно создать свой проект, вы можете просто закомментировать flipper в своем подфайле и переустановить свои поды таким образом.

Подфайл

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

Затем переустановите свои стручки. Я cd'd в корень проекта и использовал npx.

      $ npx pod-install

Наконец, попробуйте собрать и запустить свой проект:

      $ npx react-native run-ios
  1. Исправьте подфайл, как показано на изображении ниже.
  2. cd ios
  3. удалить папку Pods и Podfile.lock
  4. установка стручка
  5. обновление стручка
  6. компакт-диск .. && npx реагировать-native-ios

Если у кого-то все еще есть эта ошибка (я только что обновил 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

Перед вашим 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

Я должен прокомментировать все #ifdef FB_SONARKIT_ENABLED в AppDelegate.m установите для hermes значение false и закомментируйте Flipper в Podfile.

В конце концов, удалите Pods и Podfile.lock, затем установите pod

просто прокомментировал эту строку и решил эту проблему -

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

У меня была такая же проблема при сборке в XCode 12.5. Если временное отключение Flipper вам не подходит, вы можете перейти на версию XCode 12.4. Это исправило это для меня. Вы можете скачать XCode 12.4 здесь: https://developer.apple.com/download/more

Чтобы немного расширить ответы 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' })

А что касается исправления файлов, то в моем случае на самых последних версиях по состоянию на 30 апреля достаточно обновить DistributedMutex-inl.h только в одном месте.

Также обратите внимание, как я добавил два дополнительных символа пробела перед именем функции. Это необходимо, чтобы установка модуля не нарушала код при последующих вызовах.

        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

Замените весь текущий код флиппера в вашем Podfile на эту базу в вашей версии 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 ..

Я думаю, что ответ, предоставленный @opensw, будет работать, но я нашел что-то более расширенное решение, чтобы оно работало с установкой pod каждый раз, не удаляя Podsпапка. Прежде всего, измените добавить / заменить эту строку в своем подфиле.

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

Теперь в последних версиях, упомянутых в приведенных выше строках, исправлена ​​проблема с Flipper-folly Но мы также должны позаботиться о безумие RCT, и для этого мы будем использовать 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

Теперь вызовите эту функцию из пост-установки, поэтому нам нужно будет добавить следующие 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)")

Вот мой ответ на Github

Вы должны прокомментировать ниже код Flipper в Podfile:

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

У меня была такая же проблема при обновлении проекта с RN 0.63 до 0.64 (и с использованием Xcode 12.5), но ответ, получивший наибольшее количество голосов, не решил проблему для меня, и я старался избегать каких-либо дополнительных скриптов.

Я заметил в по помощникеобновлению некоторые изменения в подфайле - в частности, изменение с flipper_post_install(installer) к react_native_post_install(installer). Я внес это изменение и обновил свой каталог модулей, а затем запустил pod install --repo-update и это исправило это для меня :)

Я также заметил, что патч запускается для DistributedMutex файл (который был рассматриваемым файлом) после установки модулей, поэтому мне кажется, что это должно быть правильное исправление

Бонус : это также позволило мне удалить старые flipper_post_install сценарий, который у меня был в верхней части моего подфайла из предыдущего обновления

замените atomic_nofiy_one на folly::atomic_notify_one, полный подфайл будет удален:

      platform :ios, '9.0'
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'

def add_flipper_pods!
  version = '~> 0.33.1'
  pod 'FlipperKit', version, :configuration => 'Debug'
  pod 'FlipperKit/FlipperKitLayoutPlugin', version, :configuration => 'Debug'
  pod 'FlipperKit/SKIOSNetworkPlugin', version, :configuration => 'Debug'
  pod 'FlipperKit/FlipperKitUserDefaultsPlugin', version, :configuration => 'Debug'
  pod 'FlipperKit/FlipperKitReactPlugin', version, :configuration => 'Debug'
end

# Post Install processing for Flipper
def flipper_post_install(installer)
  installer.pods_project.targets.each do |target|
    if target.name == 'YogaKit'
      target.build_configurations.each do |config|
        config.build_settings['SWIFT_VERSION'] = '4.1'
      end
    end
  end
end

target 'AwesomeProject' do
  # Pods for AwesomeProject
  pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector"
  pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec"
  pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired"
  pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety"
  pod 'React', :path => '../node_modules/react-native/'
  pod 'React-Core', :path => '../node_modules/react-native/'
  pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules'
  pod 'React-Core/DevSupport', :path => '../node_modules/react-native/'
  pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS'
  pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation'
  pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob'
  pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'
  pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS'
  pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network'
  pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings'
  pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text'
  pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration'
  pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/'

  pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact'
  pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi'
  pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor'
  pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector'
  pod 'ReactCommon/callinvoker', :path => "../node_modules/react-native/ReactCommon"
  pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon"
  pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga', :modular_headers => true

  pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
  pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
  pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'

  target 'AwesomeProjectTests' do
    inherit! :complete
    # Pods for testing
  end

  use_native_modules!

  # Enables Flipper.
  #
  # Note that if you have use_frameworks! enabled, Flipper will not work and
  # you should disable these next few lines.
  add_flipper_pods!
  post_install do |installer|
    flipper_post_install(installer)
    ## Fix for XCode 12.5 beta
    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)))")
    find_and_replace("Pods/Flipper-Folly/folly/synchronization/DistributedMutex-inl.h",
             "  atomic_notify_one(state);", "  folly::atomic_notify_one(state);")
  end
end

target 'AwesomeProject-tvOS' do
  # Pods for AwesomeProject-tvOS

  target 'AwesomeProject-tvOSTests' do
    inherit! :search_paths
    # Pods for testing
  end
end

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

Я прокомментировал # use_flipper!() и ошибка ушла

Другие вопросы по тегам