class — Передача аргументов в другой исходный файл C ++

Я пытался реализовать функцию класса в течение недели безрезультатно. Обычно я был бы рад поместить логику в заголовочный файл, однако библиотека ACML конфликтует с моим использованием «сложного» include. Короче говоря, мне нужно сделать все вызовы библиотеки C ACML из отдельного файла cpp. Ниже мой код, и я не смог заставить его работать. Я использую предварительный просмотр 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 ****
}

1

Решение

В вашем заголовке отсутствует объявление функции:

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

прямо перед dgetrf определение. Обратите внимание, что вообще плохая идея ставить функцию определение (т.е. тело функции) в заголовке, как вы делаете для dgetrf, Причина в том, что вы получите несколько определений одной и той же функции, разбросанных по всему коду: одно определение для каждого включения заголовка, содержащего определение в других файлах (наиболее вероятно, в файлах cpp), и компилятор не будет знать, какая именно выбрать в качестве законного. Лекарство от этой проблемы — поставить dgetrf код в файле cpp и предоставляет только функцию декларация в заголовочном файле.

0

Другие решения

Объявление функции не отображается в вашем заголовочном файле. Если вам нужно, чтобы объявление было видимым, вы должны включить другие заголовочные файлы в свои. В целом, однако, вы не хотите, чтобы функция определение существовать в заголовочном файле, как вы делаете. Причина в том, что если ваши зависимости сформированы правильно, вы будете вызывать функцию, которая будет определяться несколько раз в одном модуле компилятора, который не удастся построить.

Кроме того, ваш основной исходный файл имеет #include <acml_lapack.h> скорее, чем #include "acml_lapack.h", которая является проблемой.

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
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector