iOS TurboModule多Spec配置出现重复符号链接错误排查
问题描述
参考React Native官方文档实现单个TurboModule正常,但配置多个Spec时出现链接错误:
10 duplicate symbols Linker command failed with exit code 1 (use -v to see invocation)
操作步骤:
- 使用
npx @react-native-community/cli@latest init FirstApp创建项目,React Native版本为0.77.0; - 在package.json中添加codegenConfig配置,包含NativeLocalStorageSpec和NativeBluetoothSpec两个模块;
- 在specs目录下创建NativeBluetooth.ts和NativeLocalStorage.ts两个Spec文件;
- 执行
cd ios、bundle install、bundle exec pod install后,在Xcode中构建项目触发上述错误。
问题排查与解决
针对多TurboModule配置出现的重复符号链接错误,可从以下几个方向排查:
1. 检查codegenConfig配置是否正确
确保package.json中的codegenConfig是统一配置扫描整个specs目录,而非为每个Spec单独配置。错误的多配置会导致codegen重复生成相同符号的代码。
正确配置示例:
"codegenConfig": { "name": "FirstAppSpecs", "type": "all", "jsSrcsDir": "./specs", "android": { "javaPackageName": "com.firstapp" } }
避免为NativeLocalStorageSpec和NativeBluetoothSpec分别设置独立的codegenConfig项。
2. 移除Xcode中手动添加的生成文件
React Native 0.70+版本中,Pod会自动管理codegen生成的GeneratedCode目录文件。如果手动将这些文件添加到Xcode编译目标中,会导致链接时重复引用符号。
解决:打开Xcode项目,找到GeneratedCode相关文件,从编译目标中移除,依赖Pod的自动配置即可。
3. 检查Spec文件中的重复命名
查看NativeBluetooth.ts和NativeLocalStorage.ts,确认是否存在同名的类型、函数或常量。例如两个文件都定义了export interface Config或同名的异步方法,codegen生成Native代码时会产生重复符号。
解决:为每个模块的命名添加独特前缀,比如BluetoothConfig、LocalStorageGetItem,确保命名唯一。
4. 清理缓存重新构建
缓存残留也可能导致重复符号问题,执行以下步骤清理:
- 删除iOS目录下的
Pods文件夹和Podfile.lock文件; - 清理CocoaPods缓存:
rm -rf ~/Library/Caches/CocoaPods; - 删除iOS构建目录:
rm -rf ios/build; - 清理Xcode Derived Data:打开Xcode → 设置 → 位置 → Derived Data,点击删除按钮;
- 重新执行
bundle install和bundle exec pod install,再尝试构建项目。
内容的提问来源于stack exchange,提问作者Morton
相关产品推荐
相关产品推荐

