1

Qt 4.7.4をインストールし、QtDLLを使用する単純なQtアプリを作成しようとしています。いつものようにifdefを介してDLLのクラスにエクスポート/インポートを追加しましたが、アプリをコンパイルするときに未解決の参照があります。また、アプリがDLLに依存するように設定しました。

主なファイルは次のとおりです。


Lib.pro

QT       -= gui

TARGET = Lib
TEMPLATE = lib

DEFINES += LIB_LIBRARY

SOURCES += lib.cpp

HEADERS += lib.h\
        Lib_global.h

symbian {
    MMP_RULES += EXPORTUNFROZEN
    TARGET.UID3 = 0xE10C4E25
    TARGET.CAPABILITY = 
    TARGET.EPOCALLOWDLLDATA = 1
    addFiles.sources = Lib.dll
    addFiles.path = !:/sys/bin
    DEPLOYMENT += addFiles
}

unix:!symbian {
    maemo5 {
        target.path = /opt/usr/lib
    } else {
        target.path = /usr/lib
    }
    INSTALLS += target
}

App.pro

QT       += core gui

TARGET = App
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

lib.h

#ifndef LIB_H
#define LIB_H

#include "Lib_global.h"
#include <QString>

class LIBSHARED_EXPORT Lib {
public:
    Lib();
    ~Lib();
    QString Hello(QString a);
};

#endif // LIB_H

Lib_global.h

#ifndef LIB_GLOBAL_H
#define LIB_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(LIB_LIBRARY)
#  define LIBSHARED_EXPORT Q_DECL_EXPORT
#else
#  define LIBSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // LIB_GLOBAL_H

このコードの何が問題になっていますか?なぜ未解決の参照なのですか?アプリでは、「../ Lib / lib.h」を含めて、クラスを使用してみます。

4

1 に答える 1

1

欠けているように見えるのは、アプリケーションと動的ライブラリの間のリンクです。

私は通常、デスクトップ (Linux) アプリに対して次のようなことを行います。

INCLUDEPATH +=  ./include
LIBS += -L./lib -lLib

どこ:

INCLUDEPATHは、共有ライブラリ .h ファイルが配置されている場所へのパスを定義します。

LIBSは、ビルドされたライブラリがある場所へのパスを定義します。

関連するドキュメントはここにあります: QMake - Declaring Other Libraries

更新しました:

プロジェクト (Linux Qt v4.7.4) をビルドし、投稿したコードを使用してライブラリにリンクすることができました。私の回答は完全に明確ではないかもしれないので、明確にしようとします。

INCLUDEPATHおよびLIBS変数をApp.proファイルに追加する必要があります。リンカーがライブラリを適切に見つけるには、パスをプロジェクトに使用しているパスに調整する必要があります。

ライブラリ += -Lパス-lライブラリ名

フォルダー構造が次のようなものであるとします。

Project
    |_ Lib (your sharded library project files)
    |_ App (your application project files)

次のように変数を調整します。

INCLUDEPATH +=  ../Lib
LIBS += -L../Lib -lLib

プラットフォームに応じて異なる方法でリンクすることに注意してください。Windows と Linux をカバーするために、次のようなことを行うことができます。

unix {
     INCLUDEPATH +=  ../Lib
     LIBS += -L../Lib -lLib
}

win32 {
     INCLUDEPATH += ../Lib
     LIBS += ../Lib.lib
}
于 2011-11-04T22:59:56.353 に答える