「Qtの基礎 - ライブラリ」の版間の差分

ナビゲーションに移動 検索に移動
468行目: 468行目:
  {
  {
  }
  }
</syntaxhighlight>
<br><br>
== 静的ライブラリと動的ライブラリの切り替え ==
静的ライブラリは、他のプロジェクトにビルド時に組み込んで使用できるのに対して、<br>
動的ライブラリは、実行時に動的にリンクされる違いがある。<br>
しかし、プロジェクトによっては、静的ライブラリと動的ライブラリのビルドを切り替えたい場合もある。<br>
<br>
以下に、静的ライブラリと動的ライブラリのリンクを切り替える方法を記載する。<br>
<br>
まず、動的ライブラリ(ここではMyLib)としてプロジェクトを作成する。<br>
この時、以下のようなプロジェクトファイルが生成される。<br>
# ...略
TARGET = MyLib
TEMPLATE = lib
DEFINES += MYLIB_LIBRARY
CONFIG += c++17
SOURCES += MyLib.cpp
HEADERS += MyLib.h\
            mylib_global.h
# ...略
<br>
上記のままでは、ビルド時に動的ライブラリしか生成されない。<br>
そのため、上記のプロジェクトファイルを以下のように変更する。<br>
<code>MAKE_MYLIB_DLL</code>マクロを定義して、値がtrue以外の場合、静的ライブラリを生成するように設定している。<br>
# ...略
TARGET = MyLib
TEMPLATE = lib
DEFINES += MYLIB_LIBRARY
CONFIG += c++17
MAKE_MYLIB_DLL = false  # trueの場合は動的ライブラリを生成する
                        # falseの場合は静的ライブラリを生成する
equals(MAKE_MYLIB_DLL, true) {
    DEFINES += MYLIB_LIBRARY
    DEFINES += DEFINE_SHARED_EXPORT
}
else {
    CONFIG += staticlib
}
# ...略
<br>
次に、グローバルヘッダファイル(xxx_global.h)を変更する。<br>
<code>DEFINED_SHARED_EXPORT</code>マクロが定義されていない場合、<code>MYLIBSHARED_EXPORT</code>マクロを未定義にしているため、動的ライブラリは生成されない。<br>
<br>
この設定のみで、静的ライブラリと動的ライブラリの切り替えができる。<br>
<syntaxhighlight lang="c++">
#ifndef MYLIB_GLOBAL_H
#define MYLIB_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(MYLIB_LIBRARY)
    #define MYLIBSHARED_EXPORT Q_DECL_EXPORT
#else
    #define MYLIBSHARED_EXPORT Q_DECL_IMPORT
#endif
#ifndef DEFINE_SHARED_EXPORT
#define MYLIBSHARED_EXPORT
#endif
#endif // MYLIB_GLOBAL_H
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>

案内メニュー