2016-08-16 130 views
0

我是Eigen的新用戶,並且遇到了奇怪的問題。我正在添加到使用OpenMP的C++項目(Visual Studio 2012編譯器,/ openmp set)。我收到一個彙編錯誤:使用/ openmp時包括<Eigen/Dense>

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

我曾嘗試谷歌周圍的答案,但未能找到解決方案。我們還有另一個項目,不使用openmp,Eigen已經成功使用了一段時間。向該項目添加/ 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

好的,請嘗試#ifdef EIGEN_HAS_OPENMP std :: cout <<「Have EIGEN_HAS_OPENMP \ n」; #endif' –

回答

1

冗長的評論,並非真正的答案:某些東西在您的項目中似乎被打破。我使用Eigen 3.2.9作爲參考,因爲您尚未指定您使用的是哪個版本。在艾根/核心(133),我們有

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

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

所以,如果你正確地在你的項目中定義EIGEN_DONT_PARALLELIZEEIGEN_HAS_OPENMP不應被定義和omp.h不應該包括在內。此外,在Parallelizer.h(30):

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

所以,如果你有正確定義EIGEN_DONT_PARALLELIZE,你不會得到你所得到的錯誤。


關於C3861的錯誤,這意味着編譯器不能找到omp_get_max_threads聲明(稱爲Parallelizer.h)。由於該代碼被稱爲#ifdef EIGEN_HAS_OPENMP內,在覈心線路#include <omp.h>,並omp_get_num_threads只是包裹在一個#if defined(__cplusplus)您可以添加在覈心或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包含在我的圖書館項目和我的測試項目中。我只是在調整我的庫項目的預處理器配置,這意味着編譯在測試項目中仍然失敗。儘管如此,這仍然不能解決我使用openf和Eigen的原始問題。 –

+0

不,但現在你可以繼續工作了。 –

+0

是的。我忘了謝謝你的協助。當我找到問題的解決方案時,我會回報這個問題。 –