重复引用错误:duplicate symbols for architecture x86_64

主题:重复引用库造成的难以解决的错误。
错误关键字:

ld: 9 duplicate symbols for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)


GenerateDSYMFile......

error: cannot parse the debug map for "/Users/LuohanCC/Library/Developer/Xcode/DerivedData/ProjectName-btzlnejejistppgnaecaydoqdomg/Build/Products/Debug-iphonesimulator/ProjectName.app/ProjectName": No such file or directory


这种错误一般会产生两个错误:

第一个错误报两个库冲突


第二个错误报找不到文件




分析:从第一个错误看出项目中重复包含了多个Reachability(replicate symbols for architecture x86_64)
解决:如果是直接拖进项目的话,并在Search Paths中的Framework Search Paths、Library Search Paths、User Header Search Paths 中删除引用。
如果是从Pods中引入的Reachability,直接从Pods删除,直接删除Podfile中的引用语句便可。
但是:如果在Pods文件夹中存在Reachability文件夹,而在Podfile中却找不到任何Reachability的引用语句,这说明这并非是通过Pod install安装的Reachability,而可能通过直接将其拖进Pods的方式来引用的,那怎么解决这个重复引用的错误呢。
解决: 1.从Pods/Pods文件夹中删除Reachability文件夹
2.删除Search Paths中Header search Paths中的"${PODS_ROOT}/Headers/Public/Reachability"
3.点击项目名Pods,删除Pods-Reachability
4.删除ProjectName/Pods/Pods.debug.xcconfig和Pods.release.xcconfig中的 -l"Pods-Reachability"

重新运行项目,问题解决!!!!(2、3、4步也通过全局搜索“-Reachability”定位的方式删除对应的内容)


<think>我们正在解决IAR编译错误:Error[Li006]:duplicatedefinitionsfor"LCD_X_Config"。这个错误表明在项目中存在多个同名的函数定义(LCD_X_XConfig)。根据引用[3]的解决方法,我们需要确保只有一个文件中定义了这个函数,而其他文件没有重复定义。步骤:1.在项目中搜索所有包含“LCD_X_Config”定义的文件。通常这个函数是emWin移植过程中需要用户实现的配置函数。2.检查是否在多个文件中(例如,可能是不同的移植文件或用户文件)都定义了该函数。3.保留一个定义(通常是你希望使用的那个,比如最新的移植版本或者官方示例中的正确实现),删除或注释掉其他重复的定义。另外,根据引用[4]的类似思路,我们可以通过删除重复项来解决。具体操作:-在IAR环境中,可以通过全局搜索(Ctrl+Shift+F)来查找“LCD_X_Config”函数定义。-如果发现多个定义,确定哪个是应该保留的(通常位于你正在使用的emWin移植层文件中),然后移除其他定义(可以删除整个函数定义,或者使用条件编译避免重复包含)。注意:有时重复定义可能是由于头文件多次包含导致重复声明,但这里是函数定义,所以更可能是多个源文件都定义了该函数。另外,检查头文件中是否有该函数的声明,确保声明放在头文件中,而定义只在源文件中出现一次。如果问题仍然存在,可以考虑使用静态函数(static)来限制作用域,但通常这个函数是全局的,所以不建议使用static,因为emWin库需要调用它。另一种方法:如果重复定义来自不同的库文件,你可能需要排除其中一个文件(在IAR工程中右键点击文件->Excludefrombuild),这样就不会编译那个文件了。根据引用[2]和[3]的经验,重复定义错误通常通过删除多余的定义或排除多余的文件来解决。请按照以下步骤操作:1.在IAR工程中,使用全局搜索功能(Ctrl+Shift+F),搜索内容为:LCD_X_Config,搜索范围选择整个工程,搜索类型选择“Exactmatch”和“Casesensitive”。2.在搜索结果中,查看哪些文件包含了这个函数的定义(即函数体,而不是声明)。3.如果发现多个文件都定义了该函数,选择保留其中一个(通常选择官方移植示例中的最新版本或最完整的版本),然后删除其他文件中的定义。4.如果这些重复定义的文件都是必需的(比如来自不同的库,且不能删除),那么可以考虑使用宏定义来避免重复。例如:#ifndefLCD_X_CONFIG_DEFINED#defineLCD_X_CONFIG_DEFINEDvoidLCD_X_Config(void){//...函数体}#endif但是这种方法对于函数定义通常不适用,因为函数定义不能重复。所以更有效的方法是确保只有一个源文件包含该函数的定义。5.如果重复定义是由于同一个文件被多次包含(比如头文件中包含函数定义,这是错误的),那么将头文件中的函数定义移到源文件中,并在头文件中改为声明。例如,在头文件中:externvoidLCD_X_Config(void);在源文件中:voidLCD_X_Config(void){//函数体}6.重新编译工程,查看错误是否消除。如果以上步骤不能解决问题,请检查是否在同一个源文件中多次定义了该函数(比如条件编译分支中重复定义)。相关问题:1.如何避免IAR中的重复定义错误?2.emWin移植过程中需要注意哪些常见问题?3.在嵌入式系统中,函数重复定义有哪些常见的解决方法?</think>### 解决Error Li006: duplicate definitions for "LCD_X_Config" 在移植emWin时遇到`Error[Li006]: duplicate definitions for "LCD_X_Config"`,表明项目中存在多个同名的`LCD_X_Config`函数定义。以下是系统级解决方案: #### 🔍 原因分析 1. **重复函数定义** emWin的移植层要求用户实现`LCD_X_Config()`函数,但该函数在多个文件(如`LCDConf.c`、用户自定义文件等)中被重复定义。 2. **头文件包含冲突** 未使用`#ifndef`/`#define`防护机制,导致头文件被多次包含时重复声明。 3. **工程文件冗余** 旧版移植文件未删除,与新文件同时存在于工程中。 #### ✅ 解决步骤 1. **定位重复定义文件** 在IAR工程中全局搜索`LCD_X_Config`: - 右键点击工程 → *Find in Files* → 输入`LCD_X_Config` - 检查搜索结果,确认定义该函数的源文件(如`LCDConf.c`、`GUIDRV_Template.c`等)。 2. **保留单一函数定义** - 删除多余的函数定义,**仅保留一个文件中的实现**(通常保留官方移植模板文件如`LCDConf.c`)。 - 示例:若在`file1.c`和`file2.c`均找到定义,删除`file2.c`中的定义: ```c // 错误示例:file2.c中重复定义 void LCD_X_Config(void) { // ... 函数体 } ``` 3. **添加头文件防护** 在声明`LCD_X_Config`的头文件(如`LCDConf.h`)中加入防护宏: ```c #ifndef LCDCONF_H #define LCDCONF_H extern void LCD_X_Config(void); // 声明而非定义 #endif ``` 4. **清理工程文件** - 移除冗余文件:检查是否包含多个移植模板(如`LCDConf.c`的不同版本),保留最新/正确的文件。 - 在IAR工程中右键点击多余文件 → *Remove* → *Delete from disk*(彻底删除)。 5. **检查文件包含链** 确保主程序仅包含必要的头文件,避免间接包含重复定义: ```c // main.c 正确示例 #include "LCDConf.h" // 单一定义来源 ``` #### ⚙️ 预防措施 - **移植规范** 使用emWin官方移植模板时,**不要修改函数名**(如`LCD_X_Config`),因其被库内部调用。 - **编译前检查** 每次添加新文件后,预编译(*Rebuild All*)以暴露重复定义问题。 #### 📌 验证结果 重新编译工程,若错误消失且emWin初始化正常(如显示屏点亮),则问题解决。 --- ### 📚 相关问题 1. 如何避免嵌入式开发中的符号重复定义(Linker Error Li006)? 2. emWin移植过程中还有哪些常见编译错误? 3. IAR工程中如何高效管理外设库文件防止冲突? > 引用参考: > [^1] 重复定义错误需检查多文件中的同名符号实现 > [^3] 中断函数重复定义的解决思路适用于全局函数 > [^4] 数据库主键冲突的删除逻辑可类比函数定义清理
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值