2013-07-08 3 views
1

У меня есть некоторые функции в dll delphi, и я хочу загрузить их (используя QtLibrary) сразу.Глобальный указатель функции. множественная ошибка определения

Могу ли я хранить эти функции в глобальных переменных, чтобы использовать его? Я попытался объявить глобальный указатель на функцию в файле .h и разрешать их в главном файле, но получил ошибку "множественное определение"

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <qlibrary.h> 
#include <QDebug> 
#include "mapwidget.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 
void MainWindow::on_pushButton_clicked() 
{ 
    QString path = "map_dll.dll"; 
    if (QLibrary::isLibrary(path)) { 
     lib = new QLibrary(path); 
     lib->load(); 
     if (!lib->isLoaded()) { 
      qDebug() << lib->errorString(); 
     } else { 
      nearestWell = (void(*)(double x, 
           double y, 
           double &wellX, 
           double &wellY)) 
       lib->resolve("nearestWell"); 

    } 
} 

}

аннулируются MainWindow :: on_pushButton_2_clicked () {

}

mainwindow.h

сообщение
#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 
#include <QLibrary> 
namespace Ui { 
class MainWindow; 
} 
class MainWindow : public QMainWindow 
{ 
Q_OBJECT 

public: 
explicit MainWindow(QWidget *parent = 0); 
~MainWindow(); 
QLibrary *lib; 

private slots: 
void on_pushButton_clicked(); 

void on_pushButton_2_clicked(); 

private: 
Ui::MainWindow *ui; 
}; 

#endif // MAINWINDOW_H 

mapwidget.h

#ifndef MAPWIDGET_H 
#define MAPWIDGET_H 

#include <QWidget> 
#include <QPainter> 


typedef void (*NearestWellFunc) (double x, double y, double &wellX, 
          double &wellY); 
extern NearestWellFunc nearestWell; 

.... 
#endif // MAPWIDGET_H 

ошибка:

debug/mainwindow.o: In function `ZN10MainWindow21on_pushButton_clickedEv': 
C:\nipi\APT\map_qt\build-MIG-Desktop_Qt_5_1_0_MinGW_32bit-Debug/../MIG/mainwindow.cpp:33: undefined reference to `nearestWell' 
C:\nipi\APT\map_qt\build-MIG-Desktop_Qt_5_1_0_MinGW_32bit-Debug/../MIG/mainwindow.cpp:40: undefined reference to `nearestWell' 
C:\nipi\APT\map_qt\build-MIG-Desktop_Qt_5_1_0_MinGW_32bit-Debug/../MIG/mainwindow.cpp:54: undefined reference to `nearestWell' 
Makefile.Debug:84: recipe for target 'debug/MIG.exe' failed 
mingw32-make[1]: Leaving directory 'C:/nipi/APT/map_qt/build- MIG-Desktop_Qt_5_1_0_MinGW_32bit-Debug' 
makefile:34: recipe for target 'debug' failed 
C:\nipi\APT\map_qt\build-MIG-Desktop_Qt_5_1_0_MinGW_32bit-Debug/../MIG/mainwindow.cpp:63: undefined reference to `nearestWell' 
collect2.exe: error: ld returned 1 exit status 
mingw32-make[1]: *** [debug/MIG.exe] Error 1 
mingw32-make: *** [debug] Error 2 
+0

Если это действительно то, что у вас есть в файле заголовка, тогда вы не должны получать ошибки множественного определения. Код, который вы опубликовали, по-видимому, является либо неточным, либо неполным. Опубликовать реальный код. – AnT

+0

Это может быть проблема «защиты файла заголовка». # Ifndef #define # endif' –

+0

Код * выглядит * хорошо, но поскольку он не является полным, мы не можем быть уверены. Проблема, похоже, не в том, что вы разместили здесь. Позаботьтесь о предоставлении [SSCCE] (http://sscce.org) - включая сообщение об ошибке * full *? –

ответ

2

Вы можете объявить переменные в файле заголовка, но вы не можете определить их.

Например, объявление переменной как extern в файле заголовка в порядке. Вы, вероятно, определите их. Добавьте ключевое слово extern в свои объявления в файле заголовка и добавьте определения в исходный файл.

+0

пример, который я предоставил, тоже не работает. – aptypr

3

Эта ошибка:

undefined reference to `nearestWell'

Является ли компилятор говоря: «Я знаю, что есть то, что называется nearestWell, но я не знаю, где она хранится (так как он не был определен)»

Эта линия:

extern NearestWellFunc nearestWell; 

говорит компилятору «где-то там будет NearestWellFunc называется nearestWell».

Это декларация - это говорит компилятору, что будет переменная называется nearestWell где-то позже.

Он должен быть сопряжен с определением , который сообщает компилятору выделить некоторое пространство для переменной. В этом случае, это будет выглядеть примерно так:

NearestWellFunc nearestWell = /* whatever the initial value should be */ 

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

Рассматривая структуру вашего примера, я бы поставил определение в mainwindow.cpp.

Смежные вопросы