冗長的評論,並非真正的答案:某些東西在您的項目中似乎被打破。我使用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_PARALLELIZE
,EIGEN_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加載正確,您應該同時出現錯誤。
確保你確實有omp。添加'#ifdef _OPENMP std :: cout <<「有OMP」<< _OPENMP <<「\ n」; #endif' –
感謝您的輸入!使用你的代碼片段,我得到了「Have OMP200203」:-)並不是一個大驚喜,因爲該項目已經將openmp用於其他目的。我有更多的文件,包括omp.h,他們似乎正確地包含從C:\ Program Files文件(x86)\ Microsoft Visual Studio 11.0 \ VC \ include文件。 –
好的,請嘗試#ifdef EIGEN_HAS_OPENMP std :: cout <<「Have EIGEN_HAS_OPENMP \ n」; #endif' –