Неопределенный символ: std::__1::__libcpp_deallocate[abi:ne180100] в сборке React Native iOS (Xcode 16) [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Неопределенный символ: std::__1::__libcpp_deallocate[abi:ne180100] в сборке React Native iOS (Xcode 16) [закрыто]

Сообщение Anonymous »

Я создаю проект React Native iOS и получаю ошибку компоновщика, связанную с libc++, на этапе архивирования/сборки.
Проект компилируется успешно, но происходит сбой на этапе связывания.
Ошибка:

Код: Выделить всё

Undefined symbol: std::__1::__libcpp_deallocate[abi:ne180100](void*, unsigned long, unsigned long)

ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Полный вывод компоновщика также показывает:

Код: Выделить всё

Undefined symbols for architecture arm64:
"std::__1::__libcpp_deallocate[abi:ne180100](void*, unsigned long, unsigned long)", referenced from:
NitroScreenRecorder.Func_void_std__optional_ScreenRecordingFile_.call(value: __C.std.__1.optional) -> () in libNitroScreenRecorder.a
Среда:
  • Xcode: 16.2
  • macOS: 15.x
  • Проект React Native
  • CocoaPods
  • Цель развертывания: iOS 16.0
  • Стандарт C++: C++20
  • Архитектура: Arm64
Проект включает в себя собственный модуль (

Код: Выделить всё

NitroScreenRecorder
), который создает статическую библиотеку (

Код: Выделить всё

libNitroScreenRecorder.a
), использующий C++ (libc++ и std::optional).
Podfile (соответствующая часть):

Код: Выделить всё

platform :ios, '16.0'

target 'ATHELIA' do
use_expo_modules!
$config = use_native_modules!

pod 'FirebaseCoreInternal', :modular_headers => true
pod 'GoogleUtilities', :modular_headers => true

use_frameworks! :linkage => :static
$RNFirebaseAsStaticFramework = true

use_react_native!(
:path => $config[:reactNativePath],
:hermes_enabled => true
)
end
В post_install я принудительно использую стандарт C++ для всех модулей:

Код: Выделить всё

installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['CLANG_CXX_LANGUAGE_STANDARD'] = 'c++20'
config.build_settings['CLANG_CXX_LIBRARY'] = 'libc++'
config.build_settings['ENABLE_CPP_LIBRARY_HARDENING'] = 'NO'
end
end
Что я уже пробовал:
  • Очистка производных данных
  • Удаление модулей и переустановка (

    Код: Выделить всё

    rm -rf Pods Podfile.lock && pod install
    )
  • Обеспечение единообразия цели развертывания во всех модулях.
  • Принудительное использование C++20 в Podfile post_install.
  • Проверка диалекта C++ в настройках сборки Xcode.
Несмотря на это, компоновщик по-прежнему сообщает:

Код: Выделить всё

std::__1::__libcpp_deallocate[abi:ne180100]
Похоже, этот символ взят из libNitroScreenRecorder.a, что предполагает возможное несоответствие libc++ ABI или несоответствие стандарта C++ между модулями и основной целью.
Вопрос:
Что может вызвать std::__1::__libcpp_deallocate[abi:ne180100] будет неопределенным во время компоновки в Xcode 16?
Связано ли это с:
  • изменениями ABI libc++ в Xcode 16
  • Несоответствием стандартов C++ между модулями
  • статической библиотекой, скомпилированной с другой Toolchain
И как правильно гарантировать, что все модули и собственные модули используют один и тот же ABI libc++ при создании проекта React Native?

Подробнее здесь: https://stackoverflow.com/questions/799 ... -native-io
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»