Я использую Qt и хочу включить библиотека ttmath. Он хорошо тестировался на Windows XP и Windows 7. Сейчас я использую Qt-creator в Ubuntu, и при попытке компилировать проект выдает следующую ошибку:
.../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
Я понятия не имею, почему это не работает, так как я мало знаю о сборке или процессе компиляции.
Я прочитал в интернете, что я решил добавить QMAKE_CXXFALGS = -fno-gcse в мой файл «.pro», но это не сработало.
Причиной этой ошибки является -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 до версии 5.0
Это ссылка на источник https://askubuntu.com/questions/618474/how-to-install-the-latest-gcurrently-5-1-in-ubuntucurrently-14-04 и эти команды они предлагают (и те, которые я использовал):
sudo add-apt-repository ppa: ubuntu-toolchain-r / test
sudo apt-get update
sudo apt-get установить gcc-5 g ++ — 5
Возможности обновления sudo —install / usr / bin / gcc gcc / usr / bin / gcc-5 60 — раб / usr / bin / g ++ g ++ / usr / bin / g ++ — 5