Я относительно новичок в C ++ (в основном у меня есть опыт работы с C #). Мне дали код для переноса из Windows в Linux, но, хотя я могу заставить Visual Studio 2010 скомпилировать его (с помощью компилятора Intel C ++), я не могу заставить его работать с gcc в linux, или компилятор Intel C ++ Linux (оба дают одинаковую ошибку). Я не думаю, что это специфическая функция Intel, которая не работает, поэтому я спрашиваю здесь, а не на форумах Intel.
Файл 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
Заранее извиняюсь, если это глупый вопрос!
Спасибо,
Томас
Редактировать: Как Ивер Правильно указано в разделе комментариев, эта проблема не существует, когда вы используете 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 должен скомпилировать этот код, но это также должно распечатать предупреждение.
Других решений пока нет …