【问题标题】:Getting error: inconsistent operand constraints in an 'asm' while porting my c++ code from linux to android出现错误:将我的 c++ 代码从 linux 移植到 android 时,“asm”中的操作数约束不一致
【发布时间】:2014-04-25 09:31:12
【问题描述】:

我的 C++ 代码在我的 Linux x86 机器上运行良好,但在将相同代码移植到运行相同 x86 架构的 Android 后,我收到错误:“asm”中的操作数约束不一致。

在我的android.mk 文件中有两个源文件,一个是.cpp 文件,另一个是.asm 文件。我认为.asm 文件没有被编译,因为如果我从android.mk 中删除它,我仍然会遇到同样的错误。 我收到以下 .cpp 文件的错误:

for(int reg = 0; reg <= max; reg++) {
    asm ("cpuid"
             : "=a" (eax),
               "=b" (ebx),
               "=c" (ecx),
               "=d" (edx)
             : "a" (reg), getting error on this line.
           "c" (0));

如果我尝试使用 nasm 单独编译 .asm 文件,它会成功编译,但在 Linux 和 android 中都不能使用 as assembler。

这个问题的解决方法是什么?

【问题讨论】:

  • 请告诉我如何在 android 上添加 nasm 汇编程序。我的 .asm 文件是用 nasm 汇编器编译的,但不是用 as 编译的。那么我们应该怎么做才能使用 nasm assembler 编译 .asm 文件。我已经在我的 x86 上安装了 nasm assembler。
  • 您使用的是哪个版本的 gcc/c++ 编译器?尝试将其更新到 4.8,如果您的操作系统没有稳定的版本,请尝试一些测试或不稳定的版本,以证明其 gcc ;)(请参阅 edukit.me/installing-gcc48stackoverflow.com/questions/16311600/…

标签: android c++ linux assembly


【解决方案1】:

Android 通常在 ARM 架构上运行,我将冒险猜测您的 Linux 运行在 x86 / AMD64 上,因为您没有指定。汇编代码(几乎可以肯定是 .asm 文件中的内容)不能在不同架构之间移植。

您需要将 .asm 文件的内容替换为可在 ARM 上运行的代码。如果删除该文件仍然给您同样的错误,那么在您的 C++ 源文件中查找任何内联汇编代码。错误消息(在发布问题时应始终完整准确地复制粘贴)应指定导致错误的文件和行号。

【讨论】:

  • 他说他在 x86 cpu 架构上使用 android。
  • @mojjj 不,他没有,在没有任何其他事实的情况下,他的 Android 很可能在 ARM 上运行。
  • 他说:“在将相同的代码移植到运行相同 x86 架构的 Android 之后”。此外,我使用较旧的 gcc/c++ 编译器版本遇到了上述错误。我在 4.7.2 并试图编译最新的 OpenCV 2.4.x - 看起来它应该在以后的 gcc/c++ 版本中修复,不幸的是,这些版本在 debian wheezy (7.7) 中不可用
  • @mojj 好吧,我看到他在我发布答案后编辑了问题。最初,他对这个平台模棱两可。
  • 是的,无论如何,这已经过时了;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
相关资源
最近更新 更多