2016-08-16 131 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

是的。我忘了谢谢你的协助。当我找到问题的解决方案时,我会回报这个问题。 –