8

私の質問は、Boost および OpenCV ライブラリと Eclipse CDR の静的リンクに多少関連しています。エラー、ここで説明されているよりも少し多くのことをしようとしています: BoostとOpenCVを使用してフォルダー内のすべての画像を読み取ることができるプログラムを作成するには? つまり、Boost のファイルシステム ライブラリを使用してディレクトリを走査し、OpenCV を使用してイメージ ファイルに対して何らかの処理を行います。

ファイルシステムとその他のライブラリを MinGW でコンパイルし、Windows 7 64 ビット システムで Eclipse CDT を使用して Boost 1.45、OpenCV 2.2、および Eigen2 を実行しようとしました。プロジェクトで単独で使用する場合、ファイルシステム ライブラリは問題なくコンパイルおよび実行されますが、上記の他の 2 つのライブラリと組み合わせると、次のエラーが発生します。

In file included from C:\boost_1_45_0/boost/filesystem/v3/path_traits.hpp:22:0, 
                 from C:\boost_1_45_0/boost/filesystem/v3/path.hpp:25, 
                 from C:\boost_1_45_0/boost/filesystem.hpp:32, 
                 from ..\src\ComputeNatScaleFunction.cpp:18: 
C:\boost_1_45_0/boost/type_traits/decay.hpp: In instantiation of 'boost::decay<cv::<anonymous enum> >': 
C:\cmake_binaries\include/opencv2/core/operations.hpp:766:23:   instantiated from here 
C:\boost_1_45_0/boost/type_traits/decay.hpp:28:66: error: 'cv::' is/uses anonymous type 
C:\boost_1_45_0/boost/type_traits/decay.hpp:28:66: error:   trying to instantiate 'template struct boost::remove_reference' 
C:\boost_1_45_0/boost/type_traits/decay.hpp:38:17: error: 'cv::' is/uses anonymous type 
C:\boost_1_45_0/boost/type_traits/decay.hpp:38:17: error:   trying to instantiate 'template struct boost::remove_reference' 
C:\boost_1_45_0/boost/type_traits/decay.hpp: In instantiation of 'boost::decay<cv::<anonymous enum> >': 
C:\cmake_binaries\include/opencv2/core/operations.hpp:917:21:   instantiated from here 
C:\boost_1_45_0/boost/type_traits/decay.hpp:28:66: error: 'cv::' is/uses anonymous type 
C:\boost_1_45_0/boost/type_traits/decay.hpp:28:66: error:   trying to instantiate 'template struct boost::remove_reference' 
C:\boost_1_45_0/boost/type_traits/decay.hpp:38:17: error: 'cv::' is/uses anonymous type 
C:\boost_1_45_0/boost/type_traits/decay.hpp:38:17: error:   trying to instantiate 'template struct boost::remove_reference' 
C:\boost_1_45_0/boost/type_traits/decay.hpp: In instantiation of 'boost::decay<Eigen::<anonymous enum> >': 
C:\Eigen2/Eigen/src/Core/GenericPacketMath.h:116:18:   instantiated from here 
C:\boost_1_45_0/boost/type_traits/decay.hpp:28:66: error: 'Eigen::' is/uses anonymous type 
C:\boost_1_45_0/boost/type_traits/decay.hpp:28:66: error:   trying to instantiate 'template struct boost::remove_reference' 
C:\boost_1_45_0/boost/type_traits/decay.hpp:38:17: error: 'Eigen::' is/uses anonymous type 
C:\boost_1_45_0/boost/type_traits/decay.hpp:38:17: error:   trying to instantiate 'template struct boost::remove_reference' 

これらのライブラリが互いに競合する理由についてのヒントはありますか? コンパイラは、ファイルシステムのインクルードを通過していません (つまり、18 行目)。

4

1 に答える 1

9

Eigenを含める前にboost::filesystem名前空間を使用すると、コンパイラが失敗します。

#include <boost/filesystem.hpp>
using namespace boost::filesystem;
#include <Eigen/Core>

失敗しますが

#include <boost/filesystem.hpp>
#include <Eigen/Core>
using namespace boost::filesystem;

動作します。

その理由は、boost :: filesystemがグローバル名前空間に追加されると、それを汚染し、汚染されていない名前空間に依存するコード(ここではeigen)がコンパイル中にエラーを引き起こすためです。何も奇妙なことはありません。通常、インクルードが終了する前に「使用」行を配置しないでください。

于 2011-03-27T13:49:18.683 に答える