0

我对 C++ 比较陌生(我主要有 C# 背景)。我已经获得了一些要从 Windows 移植到 Linux 的代码,但是虽然我可以让 Visual Studio 2010 编译它(使用 Intel C++ 编译器),但我无法让它在 linux 中与 gcc 一起工作,或 Intel 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

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

谢谢,托马斯

4

1 回答 1

0

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


因为CBLAS_ORDERandCBLAS_TRANSPOSE是枚举,而不是类/命名空间,所以它们不引入范围。这就是为什么您应该删除名称限定符:

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

但是,VC 编译器应该编译这段代码,它也应该打印一些警告

于 2013-07-25T09:11:30.670 回答