2016-08-16 8 views
0

私はEigenのかなり新しいユーザーで、奇妙な問題に遭遇しました。 OpenMP(Visual Studio 2012コンパイラ、/ openmpセット)を使用するC++プロジェクトに追加しています。コンパイルエラーが発生します。/openmpを使用した場合、<Eigen/Dense>を含む

include\eigen\src/Core/products/Parallelizer.h(34): error C3861: 'omp_get_max_threads': identifier not found

解決策を見つけることができませんでした。 Eigenがしばらく使用されているopenmpを使用しない別のプロジェクトがあります。そのプロジェクトに/ openmpを追加しても問題は発生しませんでした。 EIGEN_DONT_PARALLELIZEプリプロセッサディレクティブを使ってEigenのopenmpを無効にしようとしました。問題は解決しません。問題を解決するためのすべての提案は歓迎する以上のものです。

+0

実際にompがあることを確認してください。 '#ifdef _OPENMPを追加します std :: cout <<" OMPを持ってください "<< _OPENMP <<" \ n "; #endif' –

+0

入力いただきありがとうございます!あなたのスニペットを使って、私は "Have OMP200203"を得ます:-)プロジェクトがすでにopenmpを他の目的のために使っているので、大きな驚きはありません。 omp.hを含むより多くのファイルがあり、C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ includeのファイルが正しく含まれているようです。 –

+0

OK、#ifdef EIGEN_HAS_OPENMP std :: cout << "EIGEN_HAS_OPENMPを持っていますか?"; #endif' –

答えて

1

長いコメント、本当に答えはありません:あなたのプロジェクトで何かが壊れているようです。使用しているバージョンを指定していないので、Eigen 3.2.9を参照として使用しています。あなたが適切にあなたのプロジェクトでEIGEN_DONT_PARALLELIZEを定義した場合固有/コア(133)私たちはそう

#if (defined _OPENMP) && (!defined EIGEN_DONT_PARALLELIZE) 
    #define EIGEN_HAS_OPENMP 
#endif 

#ifdef EIGEN_HAS_OPENMP 
#include <omp.h> 
#endif 

を持っていて、EIGEN_HAS_OPENMPを定義するべきではないとomp.hが含まれるべきではありません。また、Parallelizer.h(30)に:あなたが適切EIGEN_DONT_PARALLELIZEを定義していた場合

#ifdef EIGEN_HAS_OPENMP 
if(m_maxThreads>0) 
    *v = m_maxThreads; 
else 
    *v = omp_get_max_threads(); 
#else 
*v = 1; 
#endif 

だから、あなたはあなたが取得しているエラーを取得されません。 C3861のエラーについて


、それはコンパイラが(Parallelizer.hに呼ばれる)omp_get_max_threadsの宣言を見つけることができないことを意味します。コア内のライン#include <omp.h>で、omp_get_num_threadsだけ#if defined(__cplusplus)に包まれているように、そのコードは#ifdef EIGEN_HAS_OPENMP内で呼び出されるとして、あなたはコードがアクティブであることを確認するために、Coreまたはomp.hにチェックを追加することができ

// This is in Eigen/Core 
#ifdef EIGEN_HAS_OPENMP 
static_assert(0, "OMP FILE IS INCLUDED IN CORE..."); 
#include <omp.h> 
#endif 

// This is in omp.h 
static_assert(0, "OMP FILE IS PROPERLY INCLUDED..."); 
_OMPIMP int _OMPAPI 
omp_get_num_threads(
    void 
    ); 

ompが正しく読み込まれていれば、両方のエラーが発生するはずです。

+0

EIGEN_DONT_PARALLELIZE問題の更新。これは私の悪かったです。 Eigenを使ったcppは、私の図書館プロジェクトと私のテストプロジェクトの両方に含まれていました。私は自分のライブラリプロジェクトのプリプロセッサ設定を調整していました。つまり、テストプロジェクトでコンパイルが失敗しました。これはまだ、Eigenでopenmpを使うという私の元の問題を解決するものではありません。 –

+0

いいえ、でもこれで作業できます。 –

+0

真。私はあなたの親切な援助に感謝することを忘れてしまった。問題の解決策を見つけたら、この質問に戻って報告します。 –

関連する問題