我对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
如果这是一个愚蠢的问题,请提前道歉!
谢谢, 托马斯
答案 0 :(得分:0)
编辑:在评论部分正确指出 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编译器应编译此代码,但它也应该print some warning。