2012-11-27 7 views
12

Ich erhalte diese Fehlermeldung:Fehler in OpenCV machen

OpenCV-2.4.3/modules/features2d/src/freak.cpp:437: error: unable to find a register to spill in class 'GENERAL_REGS'

Nachdem ich:

tar xfj OpenCV-2.4.3.tar.bz2 
cd OpenCV-2.4.3 
mkdir release 
cd release 
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=ON -D BUILD_EXAMPLES=ON .. 
make 

Das gleiche Verfahren funktioniert auf einer anderen Maschine. Irgendwelche Ideen?

+1

Es kann ein Fehler von Ihrem gcc sein: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35135 –

+1

Ich bekomme den gleichen Fehler. – jasonlfunk

+0

Ich habe keinen Zugriff auf die gcc auf diesem Rechner zu ändern. Ist es möglich, Cmake irgendwie zu sagen, es anders zu kompilieren? –

Antwort

15

Sie müssen in die Makefiles graben, um -O für freak.cpp zu entfernen.

UPDATE: Genau so sollte man es machen (getestet mit 2.4.3 und 2.4.4).

müssen Sie

YOUR_BUILD_DIR/modules/features2d/CMakeFiles/opencv_features2d.dir/build.make 

Suche nach freak.cpp bearbeiten. Sie finden drei Blöcke: CXX erstellen ..., CXX vorverarbeiten ... und CX kompilieren .... Ich musste nur den Bauabschnitt ändern. Die letzte Zeile dieses Blocks sieht wie folgt aus:

.... YOUR_COMPILER $(CXX_DEFINES) $(CXX_FLAGS) ... 

und wenn Sie Sie überprüfen, herausfinden, dass CXX_FLAGS ein O3 in ihm hat. Wenn Sie -O0 nach CXX_FLAGS hinzufügen, unterdrückt es das O3. Deine Linien sollten also so aussehen.

.... YOUR_COMPILER $(CXX_DEFINES) $(CXX_FLAGS) -O0 ... 

Dies funktioniert zumindest hier!

+0

Danke! Ich muss hinzufügen, dass meins kein "-O3" oder irgendein "-O" hat, was auch immer, aber es ist "-o", was für eine Objektdatei steht, nehme ich an. Also ist das Ergebnis wie folgt: "... $ (CXX_FLAGS) -O0 -o ...." und es wird weiter aufgebaut. – 5argon

7

Ich hatte auch einige Stunden lang Probleme mit meinen CentOS 5.x Boxen, und hier ist meine Lösung.

Es ist offensichtlich, dass Sie 'gcc' updaten müssen, aber nativ Upgrades über RPM durchführen oder nur RPM's zufällig auswählen, was zu einigen schwerwiegenden Konfigurationsfehlern auf Ihrem Server führt. Ich habe jetzt auch keine Zeit, gcc/g ++ über die Quelle zu kompilieren. Nachdem ich eine Zeit lang im Repo gegrast hatte, stellte ich fest, dass es tatsächlich eine 4.x Version von gcc im Basis-Repo gibt.

Tun Sie dies (oder jemand mit 'root' es bei OP zu tun, die keinen Zugriff hat):

# yum install gcc44 gcc44-c++ -y 

... CentOS/RHEL gebündelt haben eine Vorschau RPM von gcc-4.4 .6.

Dann, wenn Sie zu tun ‚cmake‘ gehen, um Ihre Release-Umgebung zu bauen, tun zumindest die folgenden (Ihr Cmake params können variieren):

# cd /path/to/OpenCV-2.4.3 
    # mkdir release && cd release 
    # env CC=/usr/bin/gcc44 CXX=/usr/bin/g++44 cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/place/to/install/ -D BUILD_PYTHON_SUPPORT=ON /path/to/OpenCV-2.4.3/ 

Das gibt Ihnen einen erfolgreichen Build von OpenCV-2.4 .3 nativ mit CenOS/RHEL 5.x.

+0

Ich habe das Problem irgendwie gelöst. Wenn Sie die Optimierungsoption zum Kompilieren von freak.cpp entfernen, funktioniert es. Sie müssen in das Makefile eintauchen, um -O für freak.cpp zu entfernen. Ich werde eine umfassendere Antwort geben, wenn ich Zeit bekomme. –

1

hatte das gleiche Problem und löste es wie wisehippy mit einer geringfügigen Änderung:

# yum install gcc44 gcc44-c++ -y 
# mkdir release && cd release 
# cmake -D CMAKE_BUILD_TYPE=RELEASE -DCMAKE_CXX_COMPILER=/usr/bin/g++44 -DCMAKE_C_COMPILER=/usr/bin/gcc44 <OpenCV_Dir> 
1

ich das zu lösende Problem gefunden, wenn ich meine c++ aktualisiert g++-g++44, anstelle des Standard zu zeigen, die 4,1 war .

Als root überprüfen Sie, dass die Dateien identisch sind, bevor Sie diesen Schritt ausführen, möglicherweise nicht für Sie erforderlich.

diff /usr/bin/c++ /usr/bin/g++ 

Es sollte nichts zurückgegeben werden, wenn die Dateien identisch sind. Wenn dies der Fall ist, fahren Sie fort. Sichern Sie Ihre alte Datei. Sie können die Datei auch löschen, weil es das gleiche wie g++ ist, aber ich möchte vorsichtig sein.

mv /usr/bin/c++ /usr/bin/c++4.1 

Erstellen Sie einen Link, so dass C++ Punkte auf Ihre g++44. Sie könnten hier auch den symbolischen Link verwenden.

ln /usr/bin/g++44 /usr/bin/c++ 

Fertig.