我一直试图实现一个类功能大约一个星期现在无济于事。通常情况下,我会很满意将逻辑放在头文件中,但是,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 ****
}
答案 0 :(得分: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
}
答案 1 :(得分:0)
您错过了标题中的函数声明:
void dgetrf_c(int *m, int *n, double *a, int *lda, int *ipiv, int *info);
在dgetrf
定义之前。请注意,将函数 definition (即函数体)放在标题中通常是一个坏主意,就像对dgetrf
一样。原因是你最终会在你的代码中散布几个相同函数的定义:每个包含在其他文件中包含定义的头文件的定义(最可能是cpp文件),编译器将不知道哪一个选择合法的。解决该问题的方法是将dgetrf
代码放在cpp文件中,并仅在头文件中提供函数声明。
答案 2 :(得分:0)
函数声明在头文件中不可见。如果您需要声明可见,那么您必须在自己的头文件中包含其他头文件。但是,一般情况下,您不希望函数 definition 存在于头文件中。原因是如果你的依赖关系以正确的方式形成,你将导致在一个编译器单元中多次定义一个函数,这将无法构建。
此外,您的主要源文件包含#include <acml_lapack.h>
而不是#include "acml_lapack.h"
,这是一个问题。