制作OpenCV时出现错误

12

我遇到了这个错误:

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

在执行以下代码后:

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

相同的程序在另一台机器上也可以运行。有任何想法吗?


1
这可能是您的gcc的一个错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35135 - Min Lin
1
我也遇到了同样的错误。 - jasonlfunk
我无法更改那台机器上的gcc。有没有办法告诉cmake以不同的方式进行编译? - Mohammad Moghimi
或者以某种方式,在不降低opencv库功能的情况下,禁用Makefile中的这个文件的编译。 - Mohammad Moghimi
4个回答

15

你需要深入研究Makefile文件,将freak.cpp的-O选项移除。

更新: 这正是应该做的方式(已测试过2.4.3和2.4.4版本)。

你需要编辑

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

搜索freak.cpp文件,你会发现三个块:正在构建CXX...,正在预处理CXX...,正在编译CX...。我只需要修改构建部分。该块的最后一行看起来是这样的:

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

如果您检查,您会发现CXX_FLAGS中有一个-O3。 如果您在CXX_FLAGS之后添加-O0,则会抑制O3。 因此,您的行应该如下所示。

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

这里至少能正常工作!


谢谢!我必须补充一点,我的代码中没有 -O3 或者任何 -O,但是有一个 -o,我猜应该是指目标文件。因此结果就像这样 ... $(CXX_FLAGS) -O0 -o ....,然后继续构建。 - 5argon

7
我在CentOS 5.x上也遇到过这个问题,花费了好几个小时才找到解决方案。
很明显,需要更新“gcc”,但通过RPM本地升级或随意获取RPM可能会导致服务器的一些严重配置问题。我现在也没有时间通过源代码编译gcc/g++。在存储库中搜索一段时间后,我发现基础存储库中确实有gcc的4.x版本。
做这个(或者让具有'root'权限的人来做,在OP没有访问权限的情况下):
  # yum install gcc44 gcc44-c++ -y

CentOS/RHEL已经捆绑了gcc-4.4.6的预览RPM。

接下来,当你进行“cmake”构建发布环境时,请至少执行以下步骤(您的cmake参数可能会有所不同):

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

这将使你在CenOS/RHEL 5.x上本地成功构建OpenCV-2.4.3。


我也设法解决了这个问题。如果你移除freak.cpp编译的优化选项,它将正常工作。你需要深入Makefile文件中,移除freak.cpp的-O选项。等我有时间时,我会给出更全面的答案。 - Mohammad Moghimi

1

我曾经遇到同样的问题,并像wisehippy一样解决了它,只不过我做了一个小小的改变:

# 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
一旦我将c++更新为指向g++44,而不是默认的g++(即4.1版本),我发现问题得到了解决。
在进行此步骤之前,请作为root用户验证文件是否相同,您可能并不需要这样做。
diff /usr/bin/c++ /usr/bin/g++

如果文件相同,则不应返回任何内容。如果是这种情况,请继续。 备份您的旧文件。您也可以删除该文件,因为它与g ++相同,但我喜欢小心一些。
mv /usr/bin/c++ /usr/bin/c++4.1

创建一个链接,使得C++指向你的g++44。你也可以在这里使用符号链接。
ln /usr/bin/g++44 /usr/bin/c++

完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接