12
votes

I'm getting this error:

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

After doing:

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

The same procedure works on another machine. Any ideas?

4
It may be a bug of your gcc: gcc.gnu.org/bugzilla/show_bug.cgi?id=35135Min Lin
I'm getting the same error.jasonlfunk
I do not have access to change the gcc on that machine. Is it possible to somehow tell cmake to compile it differently?Mohammad Moghimi
Or somehow disable compiling this file in the Makefile without reducing functionalities of the opencv library.Mohammad Moghimi

4 Answers

15
votes

You need to dig into the Makefiles to remove -O for freak.cpp.

UPDATE: This is exactly how one should do it (tested with 2.4.3 and 2.4.4).

you need to edit

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

Search for freak.cpp. You find three blocks: Building CXX..., Preprocessing CXX..., and Compiling CX.... I just needed to change the Building part. The last line of that block looks like this:

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

and if you check you find out that CXX_FLAGS has a -O3 in it. If you add -O0 after CXX_FLAGS it suppresses the O3. So your lines should look like this.

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

This is at least working here!

7
votes

I struggled with this for quite a few hours as well on my CentOS 5.x boxen, and here's my solution.

It's apparent you need to update 'gcc' but natively upgrading via RPM or just grabbing RPM's at random causing some serious config mgmt issues on your server. I don't have time to compile gcc/g++ via source right now either. After grazing out in the repo for a while, I found that there is, indeed, an 4.x release of gcc in the base repo.

Do this (or someone with 'root' to do it in case of OP who doesn't have access):

  # yum install gcc44 gcc44-c++ -y

...CentOS/RHEL have bundled a preview RPM of gcc-4.4.6.

Then when you go to do 'cmake' to build your release environment, do at least the following (your cmake params may vary):

  # 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/

That will give you a successful build of OpenCV-2.4.3 natively with CenOS/RHEL 5.x.

1
votes

Had the same problem and solved it like wisehippy with one slight change:

# 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
votes

I found the problem to be solved once I updated my c++ to point to g++44, instead of the default g++ which was 4.1.

As root verify that the files are the same before doing this step, it may not be necessary for you.

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

There should be nothing returned if the files are the same. If this is the case, continue. Backup your old file. You can delete the file as well because it's the same as g++, but I like to be careful.

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

Create a link so that C++ points to your g++44. You could use symbolic link here as well.

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

Done.