2012-11-27 37 views
12

我得到這個錯誤:錯誤作出的OpenCV

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的一個bug:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35135 –

+1

我得到了同樣的錯誤。 – jasonlfunk

+0

我無法更改該機器上的gcc。是否有可能以某種方式告訴cmake以不同的方式進行編譯? –

回答

15

您需要深入研究Makefiles以刪除對於freak.cpp的-O。

更新: 這正是應該如何做的(用2.4.3和2.4.4進行測試)。

你需要編輯

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

搜索freak.cpp。您會發現三個模塊:Building CXX ...,預處理CXX ...和編譯CX ....我只需要更改Building部分。該塊的最後一行是這樣的:

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

,如果您檢查發現,CXX_FLAGS中有一個-O3。如果在CXX_FLAGS之後添加-O0,則會抑制O3。所以你的線應該看起來像這樣。

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

這至少在這裏工作!

+0

謝謝!我必須補充說,我沒有'-O3'或者任何'-O',但是''o''代表了我想的目標文件。所以結果就像這個'... $(CXX_FLAGS)-O0 -o ....'並且它繼續構建。 – 5argon

7

在我的CentOS 5.x boxen上,我也爲此苦苦掙扎了好幾個小時,這裏是我的解決方案。

很明顯,您需要更新'gcc',但通過RPM本地升級或者只是隨意抓取RPM,導致服務器上出現一些嚴重的配置管理問題。我現在沒有時間通過​​源代碼編譯gcc/g ++。在回購一段時間後,我發現在基本回購中確實存在4.x版本的gcc。

做到這一點(或者有人用 '根',以做到在OP的情況下,誰沒有訪問):

# yum install gcc44 gcc44-c++ -y 

...的CentOS/RHEL已經捆綁GCC-4.4的預覽RPM 0.6。

然後,當你去做「cmake的」建立自己的發行環境,至少做到以下(您cmake的PARAMS可能會有所不同):

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

這會給你的OpenCV-2.4的成功構建.3原生與CenOS/RHEL 5.x.

+0

我也以某種方式解決了這個問題。如果你刪除了編譯freak.cpp的優化選項,它就可以工作。您需要深入Makefile以刪除freak.cpp中的-O。當我獲得時間時,我會給出更全面的答案。 –

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++ 

完成。