我对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_ORDER
和CBLAS_TRANSPOSE
是枚举,而不是类/命名空间,因此它们不引入作用域。这就是为什么您应该删除名称限定符:
cblas_dgemv(CblasRowMajor, transpose ? CblasTrans : CblasNoTrans, rows, cols, 1.0, m, cols, v, 1, 0.0, vout, 1);
然而,VC编译器应该编译此代码,但它还应该打印一些警告。