静的・動的ライブラリの切り替え

QtCreatorでライブラリプロジェクトを作る際、静的か動的のどちらかのライブラリを選択できるようになっています。

静的ライブラリの場合は、ほかのプロジェクトにビルド時に組み込んで使えるのに対し、共有ライブラリの場合は実行時に動的にリンクされる違いがあります。

しかし、プロジェクトによっては静的・動的なライブラリのビルドを切り替えしたい場合もあります。

そこでここでは共有ライブラリと静的ライブラリの生成を切り替えする方法を紹介したいと思います。

プロジェクトの設定

まず、ライブラリプロジェクトをとりあえず共有ライブラリ(ここではMyLib)として作ります。

すると次のようなプロジェクトファイルが作られると思います。

TARGET = MyLib
TEMPLATE = lib

DEFINES += MYLIB_LIBRARY

SOURCES += MyLib.cpp

HEADERS += MyLib.h\
        mylib_global.h

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

このままだとビルド時に共有ライブラリしか生成されません。

そこでプロジェクトファイルを次のように書き換えます。

TARGET = MyLib
TEMPLATE = lib
MAKE_MYLIB_DLL = false
	# trueならDLL生成、falseなら静的ライブラリを生成

DEFINES += MYLIB_LIBRARY

equals(MAKE_MYLIB_DLL, true){
	DEFINES += MYLIB_LIBRARY
	DEFINES += DEFINE_SHARED_EXPORT
}else{
	CONFIG += staticlib
}

#以下略

ここでIMPORT_MYLIB_DLLというマクロを定義して値がtrue以外の時に静的ライブラリを生成するように設定しています。

ヘッダファイルの生成

次にヘッダファイルに細工します。

共有ライブラリを作るとQtCreatorがグローバルヘッダファイル(プロジェクト名_global.h)を作りますが、そこに細工をします。

#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

DEFINED_SHARED_EXPORTが定義されていなければMYLIBSHARED_EXPORTを未定義にしているので、クラスの共有ライブラリは生成されません。

これだけで静的ライブラリと動的ライブラリの切り替えができます。

以上、QtCreatorで静的・動的ライブラリの切り替え方法でした。では、また!

関連項目
プライバシーポリシー