xcode上编译c语言程序报错:ld: x duplicate symbol for architecture x86_64 clang: error: linker command failed w

【主要内容:】


1. 错误提示

2. 分析错误原因

3. 解决问题办法



一、错误提示


在我们写代码过程中可能会经常遇到这样一个错误:

  1. <span style="font-size:32px;color:#ff0000;">ld: 4 duplicate symbols for architecture x86_64  
  2. clang: error: linker command failed with exit code 1 (use -v to see invocation)</span>  

如图:




二、分析错误原因

仔细读一下报错原因可以发现几个关键词:"duplicate"和"symbols"。

duplicate的中文意思是重复的复制的”,而symbols的意思是“符号”。也就是可能在你工程中引入了重复的东西。


三、解决问题办法


我总结了一下,出现duplicate出这个错误一般有三种情况:


3.1 重复导入相同的文件

   第一种情况:在工程中重复导入了某一个类或文件,这一般出现在你添加第三方库的时候比较多,在不知道的情况下又导入了一次相同的类。

   下图中我在工程中新建了一个src的文件夹,把Person类又复制了一遍又添加到工程中去,如图:



这个时候command + B编译之后出现如下错误:



 可以看出来报的还是duplicate的错误,虽然duplicate前边的数字可能不太准确,可是只要你看到duplicate这个关键字就可以去你工程中查找是不是有重复的东西被导入。


3.2 #import "XXX.h" 写成了#import "XXX.m"

  第二种情况:工程中在#import引入头文件的时候,将#import "XXX.h" 写成了#import "XXX.m"。错误的引入.m头文件 

我工程中有一个Person的类,然后我想在main函数中初始化一个对象,这个时候需要先引入Person类的.h文件。这个时候我引入了.m文件,如图:


    command + B 编译之后发现错误,如图:


你会发现还是duplicate这个错误。


3.3 在多个文件中重复定义某个东西

这个是由网友提供,错误原因如下:在两个文件中定义了相同的枚举,造成了deplicate的错误。


原文来自:http://blog.youkuaiyun.com/crazyzhang1990/article/details/49586049 转载请注明出处

### 解决方案分析 在 M1 MacBook Pro 上编译 GloVe 时遇到 `clang: error: the clang compiler does not support -march=native` 的问题[^1],这主要是因为 Apple Silicon 架构下的 Clang 编译器并不支持 `-march=native` 参数。此参数通常用于指定目标 CPU 的架构特性以优化性能,但在 ARM 平台上该选项不可用。 对于涉及 `armv4t` 架构不支持的问题以及链接器错误的情况,可以尝试以下方法: #### 方法一:移除或替换 `-march=native` 通过修改 Makefile 或构建脚本中的编译选项,将 `-march=native` 替换为适合当前平台的目标架构标志。例如,在 ARM 平台下可使用 `-mcpu=apple-m1` 来替代。 以下是调整后的代码片段: ```bash gcc -c src/vocab_count.c -o build/vocab_count.o -lm -pthread -O3 -mcpu=apple-m1 -funroll-loops -Wall -Wextra -Wpedantic ``` #### 方法二:检查 CMake 配置文件 如果项目依赖于 CMake 进行配置,则需确认其内部模块是否正确处理了 Clang 编译器的行为。根据引用提到的内容[^2],CMake 文件可能未适配特定版本的 Clang 工具链设置。因此建议手动编辑相关路径下的 `Clang.cmake` 文件,确保其中定义的工具链与实际使用的保持一致。 #### 方法三:增加缺失库的支持 针对类似于 `"Undefined symbols for architecture"` 类型的链接失败情况,可通过向项目的 **Linker Flags** 添加必要的动态库来修复。具体操作是在 Xcode 中定位到对应的 Target 设置界面,找到 **Build Phases -> Link Binary With Libraries** 节点并加入所需的 `.dylib` 文件;或者直接补充命令行参数如 `-licucore` 所述[^3]。 #### 方法四:屏蔽不必要的警告信息 有时过多无关紧要的消息干扰排查过程,此时可以根据需求过滤掉部分提示语句。利用 ARM 嵌入式开发环境里介绍的技术手段[^4],适当增删某些开关项达到静默执行的效果。比如忽略未知指令集带来的告警: ```bash -Wno-error=unknown-warning-option ``` 以上措施综合运用能够有效缓解乃至彻底消除上述提及的各种异常状况。 ### 示例修正后的 Makefile 片段 假设原始 Makefile 如下所示: ```makefile CC=gcc CFLAGS=-O3 -march=native ... LDFLAGS=-lm -pthread ... all: vocab_count glove cooccur shuffle vocab_count: $(OBJS) $(CC) -o $@ $^ $(LDFLAGS) ... ``` 更新后形式应改为: ```makefile CC=gcc ifeq ($(shell uname -a | grep Darwin),Darwin) CFLAGS=-O3 -mcpu=apple-m1 ... # For macOS with Apple Silicon else CFLAGS=-O3 -march=native ... # Default option for other platforms endif LDFLAGS=-lm -pthread ... all: vocab_count glove cooccur shuffle vocab_count: $(OBJS) $(CC) -o $@ $^ $(LDFLAGS) ... ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值