2013-06-15 4 views
1

Я работаю с облачной облачной библиотекой. Это в основном в C++ Когда я скомпилировать его, дает такую ​​ошибку:Ошибки компиляции с сообщениями ассемблера

[ 0%] Building CXX object common/CMakeFiles/pcl_common.dir/src/intersections.cpp.o 
In file included from /home/lv/pcl-trunk/common/include/pcl/point_types.h:301:0, 
       from /home/lv/pcl-trunk/common/include/pcl/common/impl/common.hpp:41, 
       from /home/lv/pcl-trunk/common/include/pcl/common/common.h:186, 
       from /home/lv/pcl-trunk/common/include/pcl/common/intersections.h:41, 
       from /home/lv/pcl-trunk/common/src/intersections.cpp:38: 
/home/lv/pcl-trunk/common/include/pcl/impl/point_types.hpp:1009:68: warning: ‘SHOT’ is deprecated [-Wdeprecated-declarations] 
/tmp/ccRLy4Re.s: Assembler messages: 
/tmp/ccRLy4Re.s:2488: Error: no such instruction: `vfmadd312ss (%r9),%xmm2,%xmm1' 
/tmp/ccRLy4Re.s:2638: Error: no such instruction: `vfmadd312ss (%rdx),%xmm2,%xmm1' 
/tmp/ccRLy4Re.s:3039: Error: no such instruction: `vfmadd312ss (%rax,%r11,4),%xmm5,%xmm1' 
/tmp/ccRLy4Re.s:3402: Error: no such instruction: `vfmadd312ss (%rax,%r11,4),%xmm5,%xmm1' 
/tmp/ccRLy4Re.s:3534: Error: no such instruction: `vfmadd312ss (%rax,%rdx,4),%xmm1,%xmm2' 
/tmp/ccRLy4Re.s:3628: Error: no such instruction: `vfmadd312ss (%rax,%rdx,4),%xmm1,%xmm2' 
/tmp/ccRLy4Re.s:6103: Error: no such instruction: `vfmadd312ss (%r11),%xmm0,%xmm4' 
/tmp/ccRLy4Re.s:6121: Error: no such instruction: `vfmadd312ss (%r11,%rbx,4),%xmm0,%xmm3' 
/tmp/ccRLy4Re.s:6131: Error: no such instruction: `vfmadd312ss (%r11,%rbp,4),%xmm0,%xmm2' 
/tmp/ccRLy4Re.s:6135: Error: no such instruction: `vfmadd312ss (%r11,%r13,4),%xmm0,%xmm1' 
/tmp/ccRLy4Re.s:6344: Error: no such instruction: `vfmadd312ss (%r10),%xmm0,%xmm1' 
/tmp/ccRLy4Re.s:11760: Error: no such instruction: `vfnmadd312ss (%rdx),%xmm0,%xmm0' 
/tmp/ccRLy4Re.s:13976: Error: no such instruction: `vfmadd312ss (%rdi),%xmm0,%xmm1' 
/tmp/ccRLy4Re.s:14125: Error: no such instruction: `vfmadd312ss (%rdx),%xmm0,%xmm1' 
make[2]: *** [common/CMakeFiles/pcl_common.dir/src/intersections.cpp.o] Error 1 
make[1]: *** [common/CMakeFiles/pcl_common.dir/all] Error 2 
make: *** [all] Error 2 

Может кто-нибудь сказать мне, как читать эти ошибки и дать мне несколько советов, чтобы решить?

ответ

-1

Возможно, вам необходимо включить расширенные векторные расширения при компиляции (и использовать инструментальную цепочку, которая поддерживает это). Попробуйте -march = core-avx2 или что-то подобное.

Если вы скомпилировали библиотеку самостоятельно, возможно, вам нужно настроить ее, чтобы не использовать AVX.

+0

К сожалению, я не опытный программист. Я не совсем понимаю вашу идею. Не могли бы вы объяснить это немного больше? –

+0

Я не знаю, как это построено, но попытайтесь заставить компилятор/ассемблер использовать -march = core-avx2.Вам нужно будет передать коммутаторы при настройке (CPPFLAGS = "- march = core-avx2) или просто отредактировать скрипты buil и добавить их. – dbrank0

+0

Нет, проблема в том, что ассемблер слишком стар, чтобы поддерживать инструкции FMA, которые компилятор Единственное, что вы могли бы сделать с помощью '-march' - отключить новые инструкции и сделать более медленный двоичный файл. –

5

Вы можете использовать команду ниже, чтобы увидеть, что ваш процессор (для компилятора): gcc -march=native -Q --help=target | grep march

Затем вы можете добавить свой тип процессора в опции ccmake CMAKE_CXX_FLAGS, для меня: CMAKE_CXX_FLAGS = -march=corei7-avx

+0

Как это поможет? Проблема заключается в том, что ассемблер слишком стар, чтобы собрать команды gcc, которые испускают. поддерживает FMA, 'gcc -march = native' или' gcc -march = haswell' будет выдавать инструкции FMA. Использование более низкого параметра '-march', который не использует инструкции FMA (или' -mno-fma'), будет стоить вам но это даже не то, что предлагает этот ответ. –

3

Вы можете добавить -march=native -mno-avx Это сработало для меня.

В моей CMakeLists.txt, я добавил выше к CMAKE_CXX_FLAGS:

SET(CMAKE_CXX_FLAGS "-ggdb -O3 -fPIC -std=c++0x -march=native -mno-avx") 

[Source can be found in this page.]

+0

Это было решение для успешной компиляции rgbdslam w ROS через ubuntu 12.04.05 i386 на ядре процессора i7. – Jacksonkr

+0

Если вы хотите сделать более медленный исполняемый файл для работыn старый ассемблер, вы должны сначала попробовать '-mno-fma' и/или' -mno-avx2' просто отключить инструкции FMA, но оставить AVX включенным. –

-1

Вы пробовали использовать другой компилятор?

У меня были ошибки ассемблера в проекте с использованием Point Cloud Library. Возможно, это связано с использованием Ubuntu 12.04 на основном процессоре i7 (см. https://github.com/uzh-rpg/rpg_svo/issues/7).

мне удалось собрать, установив «лязг» компилятору

sudo apt-get install clang 

и затем запустить CMake с:

cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ . 
+0

Это хорошее предложение: 'clang' имеет свой собственный встроенный ассемблер и иногда делает более быстрый код, чем gcc. Особенно новая версия clang должна быть лучше, чем старая gcc, особенно если ваша gcc-установка заимствована из-за невозможности использования инструкций FMA. –

1

Я столкнулся с этой проблемой при попытке установить glove.

Проблема, с которой я столкнулся, была решена путем обновления версии g ++, установленной на моем компьютере ubuntu 14.04.

Моя оригинальная версия g ++ была 4.6.4, и я обновил ее до g ++ - 5 (5.4.1, когда я ее обновил).

1

сообщение об ошибке происходит от ассемблера, что означает, что ассемблер не знает этот код сборки, например, «vfmadd312ss». это происходит, когда компилятор генерирует некоторый код сборки только для процессора, например, у Intel E5 с аркой core-avx2 есть дополнительный набор команд «расширенные векторные расширения», но если «как» является старым инструментом для изучения нового процессора, эта ошибка произойдет.

попробуйте новую версию Binutils, последняя версия 2.29.

и при компиляции кода из другого инструмента, например, «Базэла», убедитесь, что он будет называть новый «как»

+0

Это единственный хороший ответ: обновите свой ассемблер, чтобы понять инструкции AVX2/FMA, чтобы вы могли создать исполняемый файл, который использует все, что может сделать ваш процессор. (Предположительно используйте недавнюю версию компилятора, которая была выпущена после вашего оборудования, поэтому она, вероятно, будет знать, как ее настроить. Например, gcc6.4 является хорошим выбором в наши дни или последней версией gcc7.x, если вы чувствуете adventurous.) –

+0

Также стоит попробовать clang, у которого есть собственный встроенный ассемблер, поэтому он не зависит от binutils. Во многих случаях он делает лучший код, чем gcc, особенно для хруста. (По умолчанию он разворачивает крошечные циклы). –

Смежные вопросы