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

CBLAS_ORDER is not a class or namespace with gcc, but compiles fine in VS2010 (Intel C++)

本文关键字:英特尔 VS2010 但在 C++ 编译 命名空间 ORDER gcc CBLAS      更新时间:2023-10-16

我对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

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

谢谢,Thomas

编辑:正如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编译器应该编译此代码,它还应该打印一些警告。