13,000
回編集
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> |