macOS Big Sur下调用CSBackupIsItemExcluded需链接什么框架?
macOS Big Sur 下 CSBackupIsItemExcluded 函数链接解决方案
核心解决命令
如果已经编译得到cbget.o,直接使用以下命令链接即可:
cc cbget.o \ -framework CoreFoundation \ -framework CoreServices \ -o cbget
如果需要从源码直接编译运行,加上SDK头文件路径参数:
cc -I$(xcrun --show-sdk-path)/usr/include \ cbget.c \ -framework CoreFoundation \ -framework CoreServices \ -o cbget
调整说明
- 从macOS Catalina开始,系统分区设为只读,Big Sur进一步将系统内置框架统一放入 dyld 共享缓存,不再暴露
/System/Library/Frameworks/xxx.framework/xxx这类实体文件路径,直接写绝对路径链接的方式已经失效,必须使用苹果官方要求的-framework参数让链接器自动从共享缓存中查找对应框架符号。 CFURLCreateFromFileSystemRepresentation属于CoreFoundation框架,直接通过-framework CoreFoundation链接即可。CSBackupIsItemExcluded已经从废弃的Carbon框架迁移到CoreServices框架的CarbonCore子模块,不需要再链接已经被移除的Carbon框架,替换为-framework CoreServices即可。/usr/include消失是苹果官方的调整,从Xcode 10开始系统头文件全部放入对应版本的SDK目录中,通过xcrun --show-sdk-path可以获取当前激活的SDK根路径,头文件统一存放在该路径下的usr/include目录中,编译时加上-I$(xcrun --show-sdk-path)/usr/include即可正常引用stdint.h等系统头文件。
符号验证
你可以通过以下命令确认CoreServices框架确实包含CSBackupIsItemExcluded导出符号:nm -g $(xcrun --show-sdk-path)/System/Library/Frameworks/CoreServices.framework/CoreServices | grep _CSBackupIsItemExcluded
用该方案编译的二进制兼容Mojave及以上版本的macOS系统。
内容的提问来源于stack exchange,提问作者Stan Sieler
相关产品推荐
相关产品推荐

