2011-06-28 142 views
0

私が作ったライブラリ(dll)でプロジェクトをビルドしようとしています。私は前にロードするか、ライブラリを作成しようとしたことがないし、次のエラーが発生しています。Qt C++でDLLを使用する

エラー: `IMP __ZN6NeuronC1Ev」はQtで

に未定義の参照、エラーが次の行に示されています。ここで

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) <--------------------------- Error indicated here. 
{ 
    ui->setupUi(this); 
} 

プロジェクトファイル

QT  += core gui 

TARGET = Jane 
TEMPLATE = app 
LIBS += -L quote(C:\Programming\Jane\Jane\Source\Neuron.dll) 

SOURCES += main.cpp\ 
     MainWindow.cpp 

HEADERS += MainWindow.h 

FORMS += MainWindow.ui 

はNEURONSHARED_EXPORTマルコが "Neuron_global.h"

#ifndef NEURON_GLOBAL_H 
#define NEURON_GLOBAL_H 

#include <QtCore/qglobal.h> 

#if defined(NEURON_LIBRARY) 
# define NEURONSHARED_EXPORT Q_DECL_EXPORT 
#else 
# define NEURONSHARED_EXPORT Q_DECL_IMPORT 
#endif 

#endif // NEURON_GLOBAL_H 
で定義されている私は

#ifndef NEURON_H 
#define NEURON_H 

#include <QList> 
#include "Neuron_global.h" 
#include <Sensor.h> 

class NEURONSHARED_EXPORT Neuron 
{ 
public: 
    explicit Neuron(); 

    const double getOutput() const; 
    const double & getWeight() const; 

    void setWeight(const double& weight); 
private: 
    double weight;    // The weight of this neuron. 

    QList<Neuron*> neurons;  // This Neuron's children. 
    QList<Sensor*> sensors;  // This Neuron's Sensors. 
}; 

#endif // NEURON_H 

を輸出してきたクラスの1つです

アドバイスがあればこれを修正する方法については、私は非常に感謝します。

編集: libNeuron.aファイルをproファイルのLIBS引数に追加しました。しかし、私は今、次のエラーを取得しています。

LIBS + = libNeuron.a

-lNeuron.a

任意のアイデアを見つけることができませんか?

+0

あなたのDLLはQtプロジェクトをビルドしようとしているのと同じコンパイラ(バージョンを含む)でビルドされていますか?異なるコンパイラ(または同じコンパイラの異なるリビジョン)でも、C++関数の名前を変更するスキームが異なることがあります。これは、表示されている種類のエラーを引き起こす可能性があります。 – Praetorian

+0

'ui'変数がポインタとして宣言されている理由はありますか?そうしないと、ダイナミックなメモリ割り当てで初期化する必要がなくなるため、おそらく問題を絞り込むのに役立つかもしれません。 – qid

+0

どちらも同じコンパイラとマシンがDLLとプログラムに使用されていました。 – jecjackal

答えて

1

何をしようとしていますか?

LIBS += -L quote(C:\Programming\Jane\Jane\Source\Neuron.dll) 

変数にはライブラリファイルではなくリンク先のlib-filesが含まれています。

dll用のlibを見つけるか、DLLを動的に読み込むためにWINAPI LoadLibrary/GetProcAddres関数を使用する必要があります。

+0

私はあなたの権利を考える。私はLIBSのドキュメントを再読み込みし、Symbianプラットフォームにdllを追加することについて言及しています(Windowsでは奇妙ではありません)。 – jecjackal

+0

LIBS + = $$引用符(C:\ Programming \ Jane \ Jane \ Source \ Neuron.dll) "$$"に注意してください。これまでのところすべてが正しく機能しています。 – jecjackal

0

これは私の素早い推測です。あなたの問題は、C++ネームマングリングの原因となります。 Google 「qt dll c++ name mangling」 をご利用いただき、dll/clientプロジェクトの作業例をご覧ください。

0

この場合、すべてのことが正しいように見えます(この場合、Windows v。Linuxの動作は異なりますがはappテンプレートで作成されているため定義されていないものとします)。

qmakeは、すべての変更をピックアップしないことが知られていること、それは私がお勧めするべきで再実行しているのqmakeをして、あなたのメイクバリアント(例えば作る、gmakeを、NMAKE):いくつかの中で

$ qmake 
$ nmake 

実際にはすべてが正しくリンクできるようになるには、cleanを実行する(または関連するオブジェクトファイルを削除する)必要があります。

関連する問題