Call to undeclared function 'OSAtomicCompareAndSwapPtrBarrier'; ISO C99 and later do not support imp

这个错误表明您尝试调用 OSAtomicCompareAndSwapPtrBarrier 函数,但在您的项目中没有声明它。这通常是因为:

  1. 缺少相关头文件

    • OSAtomicCompareAndSwapPtrBarrier 函数定义在 libkern/OSAtomic.h 中。如果没有包含该头文件,编译器会认为该函数未定义。

    确保在需要使用该函数的文件中添加:

    #include <libkern/OSAtomic.h>
  2. API 已被废弃OSAtomic 系列 API 已在 macOS 10.12 和 iOS 10 中被标记为废弃。如果您使用的是较新的 macOS 或 iOS SDK,OSAtomic 系列可能已经完全被移除。

    在这种情况下,即使您包含了 libkern/OSAtomic.h,编译器仍可能报错。


解决方法

方法 1: 使用 stdatomic 替代

建议将代码迁移到现代的 stdatomic API 中。例如:

#include <stdatomic.h>

// 替换 OSAtomicCompareAndSwapPtrBarrier
void *expected = oldValue;
bool result = atomic_compare_exchange_strong((_Atomic void **)&target, &expected, newValue);

stdatomic 是 C11 标准的一部分,已经广泛支持,并推荐用于现代开发。


方法 2: 手动定义(临时解决)

如果您暂时无法修改代码,可以通过手动定义 OSAtomicCompareAndSwapPtrBarrier 作为过渡:

#include <stdatomic.h>

#define OSAtomicCompareAndSwapPtrBarrier(oldValue, newValue, target) \
    atomic_compare_exchange_strong((_Atomic void **)(target), (void **)&(oldValue), (void *)(newValue))

但这种方式仅适用于过渡,最终仍需更新为标准化的实现。


方法 3: 降级 Xcode 或 SDK 版本

如果无法立即修改代码,并且项目必须使用 OSAtomic,可以尝试使用较旧的 macOS 或 iOS SDK。下载并配置旧版 Xcode 或 SDK(如 macOS 10.11 SDK),但这种方法仅适用于紧急情况,不推荐长期使用。


方法 4: 更新依赖项

如果问题出在第三方库中,检查是否有更新版本。例如,SVGAPlayer 库可能已经修复了此问题。通过以下命令更新依赖:

  • CocoaPods:

    pod update
  • Carthage:

    carthage update

如果仍有问题,请提供更多上下文信息,包括:

  • 使用的 SDK 或 Xcode 版本。

  • 相关代码片段或依赖项。

解法:

#import <libkern/OSAtomic.h> // 在对应的文件上引入头文件

Last updated