CBLAS_ORDER不是带有gcc的类或命名空间,但在VS2010(英特尔C ++)中编译良好

时间:2013-07-25 09:02:30

标签: c++ linux gcc intel intel-mkl

我对C ++比较陌生(我主要有C#背景)。我已经获得了一些从Windows移植到Linux的代码,但是虽然我可以使用Visual Studio 2010来编译它(使用英特尔C ++编译器),但我无法使用linux中的gcc工作,或英特尔C ++ Linux编译器(两者都给出相同的错误)。我不认为这是英特尔特定的功能不起作用,这就是为什么我在这里问而不是在英特尔论坛上。

我正在尝试编译的文件DoubleMatrixOperations.cpp是:

#include <ipp.h> 
#include <mkl.h> 

extern "C" 
{ 
void Multiply_mdvd_vd(int rows, int cols, double* vout, double* m, double* v, bool transpose) 
{ 
cblas_dgemv( 
CBLAS_ORDER::CblasRowMajor, 
transpose ? CBLAS_TRANSPOSE::CblasTrans : CBLAS_TRANSPOSE::CblasNoTrans, 
rows, cols, 1.0, m, cols, v, 1, 0.0, vout, 1); 
} 
}

编译器的输出是:

$ gcc DoubleMatrixOperations.cpp -I$IPPROOT/include
DoubleMatrixOperations.cpp: In function âvoid Multiply_mdvd_vd(int, int, double*, double*, double*, bool)â:
DoubleMatrixOperations.cpp:9:4: error: âCBLAS_ORDERâ is not a class or namespace
DoubleMatrixOperations.cpp:10:16: error: âCBLAS_TRANSPOSEâ is not a class or namespace
DoubleMatrixOperations.cpp:10:46: error: âCBLAS_TRANSPOSEâ is not a class or namespace

如果这是一个愚蠢的问题,请提前道歉!

谢谢, 托马斯

1 个答案:

答案 0 :(得分:0)

编辑:在评论部分正确指出 hivert 时,使用C ++ 11时不存在此问题。下面的解决方案适用于较旧的编译器。


由于CBLAS_ORDERCBLAS_TRANSPOSE是枚举,而不是类/命名空间,因此它们不会引入范围。这就是你应该删除名称限定符的原因:

cblas_dgemv(CblasRowMajor, transpose ? CblasTrans : CblasNoTrans, rows, cols, 1.0, m, cols, v, 1, 0.0, vout, 1);

但是,VC编译器应编译此代码,它也应该print some warning