macOS 上程序对系统依赖的判定与 Linux 不一样。
Linux 只保证了系统调用的 ABI 是稳定的,但它不提供任何用户态环境的保障,所以程序需要静态链接 C runtime 等依赖项。
但 macOS 只保证了 C runtime 和一大堆系统库的 API 是稳定的,它不保障系统调用是稳定的 (
https://developer.apple.com/forums/thread/706419 ),程序必须链接到 macOS 提供的 C runtime (以及 libSystem 之类) 的动态库上。
即使在 OS X 10.10 上,系统中也存在 /usr/lib/libz.1.dylib 和 /usr/lib/libSystem.B.dylib 。如果编译选项正确的话,Xcode 14 编译出来的程序能在 macOS 10.13 (甚至更早的系统) 上运行。
TL;DR:
如果只需要支持 Xcode 兼容的 deployment target (Xcode 14: macOS 10.13 或更新),在满足 (1) 不链接到系统路径以外的动态库,(2) export MACOSX_DEPLOYMENT_TARGET=10.13 环境变量,或者提供了 -mmacosx-version-min=10.13 编译参数,(3) 编译 x86_64 和 ARM64 两份架构的代码,就应该能保证程序能在 macOS 10.13 以后的系统上运行。
如果要支持 OS X 10.9 或更老的系统,或者 i386/PPC 架构的话,就超出我的实践范围了。