1

我知道这个问题已经有几个答案,但我似乎无法理解为什么我不断收到这个错误。

所以这里是解释:我有 64 位机器,我在其中安装了 Windows 7 x64。我正在 Windows 上的 GCC (CodeBlocks) 下编译我的代码,完全没有任何问题。然后我决定我的应用程序必须是可移植的,我决定在 Linux 上在 GCC 下编译它。在我的另一台 32 位机器上,代码编译没有任何问题。但是,在我的 64 位机器上,我决定将 Ubuntu 安装为 Wubi。当然我也安装了五笔x64版本。

我在 Wubi 下成功安装了 Ubuntu,我安装了所有必要的东西,但是当我尝试编译我的项目时,我在第一行得到错误“你选择的 cpu 不支持 x86-64 指令集”。好吧,这对我来说听起来完全没有意义,考虑到我已经在 64 位机器上安装了 Wubi x64,在 Windows 7 x64 上。那么为什么我会收到一条错误消息,说我的 CPU 不支持 x86-64 指令集呢?

难道仅仅是因为我安装了 WUBI 而不是以正常方式在 root 上安装 Ubuntu 吗?这个东西我真的看不出来。

非常感谢你

编辑:好的,在 Codeblocks 的某个地方,我找到了为“Pentium M”架构检查的选项。我没有选中它,现在我得到了几个错误,例如:

错误:从 void* 转换为 int 会丢失精度。

出于什么原因,这应该只发生在 Linux 而不是 Windows 上?

4

1 回答 1

9

基于此评论:

编辑:好的,在 Codeblocks 的某个地方,我找到了为“Pentium M”架构检查的选项。我没有选中它,现在我得到了几个错误,例如:

这就是编译问题的原因——“Pentium M”是 32 位架构。CodeBlocks 下的 gcc 默认会在 Windows 上生成 32bit代码

错误:

错误:从 void* 转换为 int 会丢失精度。

是因为 linux x64 上 64 位的模型是LP64, where sizeof(long) == sizeof(pointer) == 64bits,sizeof(int) == 32bits并且您试图将指针 ( void *)(64 位) 推入int( 32 位 ) 中,这会导致指针信息丢失。

对于这样的编译错误,很可能代码不是 64 位干净的。

出于什么原因,这应该只发生在 Linux 而不是 Windows 上?

x64 上的 Linux 默认生成 64 位应用程序,您需要添加-m32程序的构建选项以使其生成 32 位代码(可能有一个 CodeBlocks 目标选项来执行此操作)

于 2012-10-18T09:56:44.153 回答