12

このエラーが発生します:

OpenCV-2.4.3 / modules / features2d / src / freak.cpp:437:エラー:クラス「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

同じ手順が別のマシンでも機能します。何か案は?

4

4 に答える 4

15

freak.cppの-Oを削除するには、Makefileを掘り下げる必要があります。

更新:これはまさにそれを行うべき方法です(2.4.3および2.4.4でテスト済み)。

編集する必要があります

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

freak.cppを検索します。3つのブロックがあります:Building CXX ...、Preprocessing CXX ...、CompilingCX....私はBuilding部分を変更する必要がありました。そのブロックの最後の行は次のようになります。

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

チェックすると、CXX_FLAGSに-O3が含まれていることがわかります。CXX_FLAGSの後に-O0を追加すると、O3が抑制されます。したがって、行は次のようになります。

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

これは少なくともここで機能しています!

于 2013-01-31T06:00:58.250 に答える
7

私はCentOS5.xボクセンでもかなりの数時間これに苦労しました、そしてこれが私の解決策です。

'gcc'を更新する必要があることは明らかですが、RPMを介してネイティブにアップグレードするか、RPMをランダムに取得するだけで、サーバーで重大な構成管理の問題が発生します。現在、ソース経由でgcc /g++をコンパイルする時間もありません。しばらくの間レポで放牧した後、実際、ベースレポでgccの4.xリリースがあることがわかりました。

これを実行します(または、アクセス権を持たないOPの場合は、「root」を使用して実行します)。

  # 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 /RHEL5.xを使用してネイティブにOpenCV-2.4.3を正常にビルドできます。

于 2012-12-11T18:24:27.213 に答える
1

同じ問題があり、1つのわずかな変更で賢明なようにそれを解決しました:

# 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> 
于 2013-06-02T10:20:56.160 に答える
1

デフォルトの4.1ではなく、c++を指すように更新すると、問題が解決することがわかりました。g++44g++

この手順を実行する前に、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++

終わり。

于 2014-03-11T20:35:02.810 に答える