can’t convert between vector values of different size return (__m64) __builtin_ia32_vec_init_v2si

在使用CMake编译时遇到大量错误,提示'can’t convert between vector values of different size'。错误出现在内置的mmintrin.h头文件中。通过两种方法解决了该问题:1. 将编译选项--std=c++11改为--std=gnu++11;2. 添加-U__STRICT_ANSI__宏定义。这两种方法均能成功编译项目。

在cmake编译的时候,发现报大量的错误:

can’t convert between vector values of different size return (__m64) __builtin_ia32_vec_init_v2si (__i0, __i1);
                                                          ^
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/mmintrin.h: 在函数‘__m64 _mm_set_pi16(short int, short int, short int, short int)’中:
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/mmintrin.h:866:70: 错误:can’t convert between vector values of different size
   return (__m64) __builtin_ia32_vec_init_v4hi (__w0, __w1, __w2, __w3);
                                                                      ^
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/

<think>我们正在处理一个关于在Linux环境下编译代码时修改Makefile的问题。用户希望将CFLAGS中的`-arch x86_64`替换为`-m64`。根据提供的引用[1],我们看到一个Makefile的示例,其中在64位架构下使用了`-m64`标志。 步骤分析: 1. 在Makefile中,通常有一个变量CFLAGS用于设置C编译器的标志。 2. 用户需要将CFLAGS中可能出现的`-arch x86_64`替换为`-m64`。 3. 需要注意的是,`-arch`标志通常是macOS(或Darwin系统)中clang编译器使用的,而Linux下gcc或clang通常使用`-m64`来指定64位编译。 根据引用[1]中的示例,在64位架构下,他们通过条件判断设置了`M64 = -m64`,然后将`$(M64)`加入到CFLAGS中。 因此,我们可以有两种情况: 情况1:Makefile中已经显式地写了`-arch x86_64`,我们需要将其替换为`-m64`。 情况2:我们可能想根据架构自动设置,即当检测到是x86_64架构时,添加`-m64`标志。 根据用户的问题,他们明确要求替换。所以我们需要找到CFLAGS中出现的`-arch x86_64`并替换为`-m64`。 但是,请注意,在Linux环境下,通常不需要`-arch`标志,因为gcc并不支持这个标志。所以这个标志可能是从其他系统(如macOS)的Makefile中移植过来的。因此,直接替换掉是合理的。 操作步骤: 1. 打开Makefile文件(用户可能需要根据实际路径修改,例如/opt/magent-0.6/Makefile)。 2. 找到CFLAGS的定义行,可能类似于: CFLAGS = -Wall -g -O2 -I/usr/local/include -arch x86_64 或者 CFLAGS += ... -arch x86_64 ... 3. 将`-arch x86_64`替换为`-m64`。 注意:在Makefile中,可能有多个地方设置CFLAGS,需要检查所有设置CFLAGS的地方。 另外,根据引用[1]中的示例,他们使用了条件判断来设置: ARCH := $(shell uname -m) X64 = x86_64 ifeq ($(ARCH), $(X64)) M64 = -m64 endif CFLAGS = ... $(M64) ... 这种方式更通用,因为它只在64位系统上添加`-m64`标志,而在32位系统上则不加。但是用户的要求是替换,所以我们也可以考虑采用这种方式来避免直接写死`-m64`,但这不是用户明确要求的。 由于用户明确要求替换,我们假设用户希望直接修改CFLAGS中的字符串。 因此,我们可以使用文本编辑工具(如sed)或手动编辑Makefile来实现替换。 手动编辑:找到包含`-arch x86_64`的行,将其改为`-m64`。 或者使用sed命令(如果用户有多个Makefile或需要批量修改): sed -i 's/-arch x86_64/-m64/g' /path/to/Makefile 但是,请注意,如果Makefile中并没有`-arch x86_64`,而是其他形式(比如`-arch=i386`等),那么替换可能不会发生。所以用户需要确认Makefile中确实有`-arch x86_64`。 另外,如果用户希望采用条件判断的方式,我们可以修改Makefile,添加条件判断,如引用[1]所示。 总结:根据用户的具体要求(替换),我们提供两种方法: 方法1:手动编辑Makefile,直接替换字符串。 方法2:使用sed命令进行替换。 同时,我们也可以建议用户使用条件判断的方式,这样更通用,但需要修改Makefile的结构。 由于用户的问题描述中引用了[1],其中展示了条件判断的方式,我们可以参考这种方式。 因此,我们可以这样修改Makefile(如果还没有条件判断的话): 1. 在Makefile开头定义架构检测: ARCH := $(shell uname -m) X64 = x86_64 ifeq ($(ARCH), $(X64)) M64 = -m64 else M64 = endif 2. 然后在CFLAGS的定义中加入$(M64): CFLAGS = ...其他标志... $(M64) 这样,在x86_64架构下,CFLAGS就会包含`-m64`,而其他架构则不加。 但是,用户原来的CFLAGS中可能有`-arch x86_64`,我们也可以先移除它,然后用上述条件判断来添加`-m64`。 所以,综合建议: 步骤1:从CFLAGS中移除`-arch x86_64`(如果有的话)。 步骤2:添加条件判断,在64位系统上添加`-m64`。 这样既去除了非Linux的编译标志,又为64位系统添加了正确的标志。 操作示例(修改Makefile): 1. 删除CFLAGS中出现的`-arch x86_64`(可能不止一处,需要检查)。 2. 在Makefile的开头(任何使用CFLAGS之前)添加: ARCH := $(shell uname -m) X64 = x86_64 ifeq ($(ARCH), $(X64)) M64 = -m64 else M64 = endif 3. 在CFLAGS的定义中,加上$(M64),例如: CFLAGS = -Wall -g -O2 -I/usr/local/include $(M64) 注意:如果CFLAGS已经在多个地方定义,可能需要整合。 如果用户希望简单替换,那么直接替换即可。 根据用户的问题,我们提供两种方案: 方案一(直接替换): sed -i 's/-arch x86_64/-m64/g' /opt/magent-0.6/Makefile 方案二(使用条件判断,更健壮): 手动编辑Makefile,添加条件判断,并移除原有的`-arch x86_64`,然后在CFLAGS中添加$(M64)。 由于引用[1]中已经有一个Makefile示例,我们可以参考它来修改。 最后,注意备份Makefile,以防修改出错。 相关问题: 1. 如何检测Linux系统的架构? 2. Makefile中条件判断的语法是什么? 3. 在Makefile中,如何设置编译标志? 4. 为什么在Linux下使用`-m64`而不是`-arch x86_64`?</think>### 在 Linux 中替换 CFLAGS 中的 `-arch x86_64` 为 `-m64` 在 Linux 环境下,`-arch x86_64` 是 macOS 特有的编译标志,而 Linux 的 GCC/G++ 编译器使用 `-m64` 表示 64 位编译。以下是修改方法: #### 修改步骤: 1. **定位 Makefile 中的 CFLAGS** 在 Makefile 中找到定义 `CFLAGS` 或 `CXXFLAGS` 的位置,通常形如: ```makefile CFLAGS = -Wall -O2 -arch x86_64 -I/usr/include # 需修改的行 ``` 2. **直接替换标志** 将 `-arch x86_64` 替换为 `-m64`: ```makefile CFLAGS = -Wall -O2 -m64 -I/usr/include # 修改后 ``` 3. **条件判断(推荐)** 参考引用[1]的健壮写法,通过架构检测动态设置: ```makefile ARCH := $(shell uname -m) # 获取系统架构 X64 = x86_64 # 定义64位标识 ifeq ($(ARCH), $(X64)) M64 = -m64 # 64位系统添加 -m64 else M64 = # 其他架构留空 endif CFLAGS = -Wall -O2 $(M64) -I/usr/include # 动态注入标志 ``` #### 验证修改: ```bash make clean # 清理旧编译 make # 重新编译 ``` - 检查编译日志中是否出现 `-m64` - 用 `file 生成的可执行文件` 确认输出包含 `ELF 64-bit` #### 注意事项: 1. **符号兼容性** `-arch` 是 macOS 的跨架构标志,Linux 需用 `-m64` 明确指定 64 位编译[^1]。 2. **交叉编译** 若需交叉编译,改用 `-m64` 同时需确保工具链支持: ```makefile CC = x86_64-linux-gnu-gcc # 指定64位交叉编译器 ``` 3. **其他相关标志** - 动态库路径:确保 `-L/usr/lib64` 存在(64位库目录) - C++11 支持:如引用[3]所述,使用 `-std=gnu++11` 替代 `-std=c++11` 避免兼容问题[^3] > **关键区别**: > `-arch x86_64`(macOS Clang)→ 指定目标架构 > `-m64`(Linux GCC)→ 生成64位代码 > 两者语义相似但编译器实现不同[^2]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值