我正在使用Qt并希望包含ttmath library。它在Windows XP和Windows 7上测试良好。我现在在Ubuntu上使用Qt-creator,当我尝试编译项目时,出现以下错误:

.../ttmathuint_x86.h:637: error: inconsistent operand constraints in an 'asm'
 : "cc", "memory" );
                   ^

部分代码如下所示:
#ifdef __GNUC__
uint dummy, dummy2;

__asm__  __volatile__(

        "xorl %%edx, %%edx    \n"
        "negl %%eax           \n"  // CF=1 if rax!=0 , CF=0 if rax==0

    "1:                                 \n"
        "movl (%%esi,%%edx,4), %%eax    \n"
        "sbbl %%eax, (%%ebx,%%edx,4)    \n"

        "incl %%edx                     \n"
        "decl %%ecx                     \n"
        "jnz 1b                         \n"

        "adc %%ecx, %%ecx               \n"

    : "=c" (c), "=a" (dummy), "=d" (dummy2)
    : "0" (b),  "1" (c), "b" (p1), "S" (p2)
    : "cc", "memory" );

#endif

仅当我将解析器添加到项目中时(如上一个示例中的一个),该错误才会显示:http://www.ttmath.org/samples

我不知道为什么这行不通,因为我对汇编或编译过程了解甚少。

我在互联网上读到,解决方案是在我的“.pro”文件中添加QMAKE_CXXFALGS = -fno-gcse,但是没有用。

最佳答案

发生此错误的原因是-fPIC-fpic编译器标志,该标志指示应发出与位置无关的代码。为了找到变量,它使用一个全局偏移表,其指针存储在ebx中。因此,使用此标志,您将不能在内联汇编中使用ebx

根据https://software.intel.com/en-us/blogs/2014/12/26/new-optimizations-for-x86-in-upcoming-gcc-50-32bit-pic-mode,在GCC 5.0中对此进行了更改。
该库可能会更改您的标志,因此您必须查看是否可以更改代码。

08-16 11:13