1

我一直在尝试实现一个类函数大约一个星期,但无济于事。通常,将逻辑放在头文件中我会很满意,但是,ACML 库与我对“复杂”包含的使用相冲突。长话短说,我需要从一个单独的 cpp 文件对 C ACML 库进行所有调用。下面是我的代码,我一直无法让它工作。我正在使用 Visual Studio 2013 预览版,但出现以下编译错误:

acml_lapack.h(8): error C3861: 'dgetrf_c': identifier not found

如何调用并将参数传递给物理上位于另一个 *.cpp 文件中的函数?我找到了关于这个主题的其他帖子,但我必须遗漏一些东西,因为我的代码不起作用。

头文件:

// acml_lapack.h
#ifndef __ACML_LAPACK
#define __ACML_LAPACK

void dgetrf(int m, int n, double *a, int *ipiv, int &info)
{
     if (m && n)
    dgetrf_c(&m, &n, a, &m, ipiv, &info);
}
#endif

附加 *.cpp 文件:

// acml_lapack.cpp
#include <acml.h>
#include "acml_lapack.h"

void dgetrf_c(int *m, int *n, double *a, int *lda, int *ipiv, int *info)
extern "C" {
     void dgetrf_(int *m, int *n, double *a, int *lda, int *ipiv, int *info);  //call C AMD Core Math Library lapack
}

主要源文件:

// source.cpp
#include <acml_lapack.h>
using namespace std;

int main()
{
// **** Start test acml ****
double A[2][2];
A[0][0] = 1;
A[0][1] = 2;
A[1][0] = 3;
A[1][1] = 4;

cout << "before: " << endl;
cout << A[0][0] << A[0][1] << endl;
cout << A[1][0] << A[1][1] << endl;

int LDA = 2;
int * output;

//call external function from another cpp file
dgetrf(2, 2, *A, &LDA, *output); 

cout << "after: " << endl;
cout << A[0][0] << A[0][1] << endl;
cout << A[1][0] << A[1][1] << endl;

// **** END TEST ****
}
4

3 回答 3

0

将附加的 .cpp 文件更改为

// acml_lapack.cpp
#include <acml.h>
#include "acml_lapack.h"

extern "C" {
     void dgetrf_(int *m, int *n, double *a, int *lda, int *ipiv, int *info);  //call C AMD
}

void dgetrf_c(int *m, int *n, double *a, int *lda, int *ipiv, int *info)
{
     dgetrf_(m, n, a, lda, ipiv, info);  //call C AMD Core Math Library lapack
}
于 2013-08-05T01:44:36.223 回答
0

您在标题中缺少函数声明:

void dgetrf_c(int *m, int *n, double *a, int *lda, int *ipiv, int *info);

就在dgetrf定义之前。请注意,像dgetrf. 原因是你最终会在你的代码中得到同一个函数的多个定义:每个包含包含其他文件(很可能是 cpp 文件)中定义的标头的一个定义,编译器将不知道是哪一个选择作为合法的。解决这个问题的方法是将dgetrf代码放在一个 cpp 文件中,并且只在头文件中提供函数声明。

于 2013-08-05T01:47:18.953 回答
0

函数声明在您的头文件中不可见。如果您需要使声明可见,则必须在自己的头文件中包含其他头文件。但是,一般来说,您不希望函数定义像您所做的那样存在于头文件中。原因是,如果您的依赖关系以正确的方式形成,您将导致在一个编译器单元内多次定义一个函数,这将无法构建。

此外,您的主源文件有#include <acml_lapack.h>而不是#include "acml_lapack.h",这是一个问题。

于 2013-08-05T06:50:37.790 回答