2014-03-03 8 views
3

Qt를 사용 중이고 ttmath library을 포함하고 싶습니다.'asm'의 일관되지 않은 피연산자 제약

: 코드의

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

제품과 같습니다 : 그것은 내가 지금 우분투에 Qt는 제작자를 사용하고 나는 그것이 나에게 다음과 같은 오류를 제공하는 프로젝트를 컴파일 할 때 Windows XP 및 Windows 7에서 잘 테스트 내가 마지막 예제에서처럼 내 프로젝트에 파서를 추가 할 때

#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를 추가하는 것이 해결책이라고 읽었지만 작동하지 않습니다.

+0

이것은 32 비트 빌드입니까? –

+0

정확히 어느 버전의 컴파일러를 사용하고 있습니까? –

+0

예, 32 비트입니다. Qt 5.0.2 (GCC 4.7.3, 32 비트)를 기반으로합니다. –

답변

2

이 오류의 원인은 위치 독립적 코드가 방출되어야 함을 나타내는 -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에서 변경되었습니다. 라이브러리가 플래그를 변경하여 코드를 변경할 수 있는지 확인해야합니다. 내 경우에는 내가 버전으로 내 GCC를 업데이트하여 해결할 수에서

0

5.0

이 소스 링크 https://askubuntu.com/questions/618474/how-to-install-the-latest-gcurrently-5-1-in-ubuntucurrently-14-04이며,이 그들이 제안하는 명령 (그리고 내가 사용하는 사람)은 다음과 같습니다

sudo를 추가-APT -repository PPA : 우분투 - 툴체인-R/테스트 는 sudo apt-get을 업데이트 는 sudo apt-get을 설치 GCC-5g ++ - 5

는 sudo 갱신 대안 --install는/usr/빈/GCC GCC는/usr/bin/gcc-5 60 - 슬레이브/usr/bin/g ++ g ++/usr/bin/g ++ - 5

관련 문제