サーチ…


デフォルトの「pro」ファイル。

qmakeはビルドオートメーションツールで、 Qtフレームワークに同梱されています。これは、 CMakeGNU Autotoolsのようなツールと似た仕事をしますが、 Qtと一緒に使うように設計されています。このように、 Qtエコシステム、特にQt Creator IDEとよく統合されています。

Qt Creatorを起動し、 File -> New File or Project -> Application -> Qt Widgetsアプリケーションを選択すると、 Qt Creatorはプロジェクトスケルトンを "pro"ファイルと共に生成します。 "pro"ファイルは、ファイルを生成するためにqmakeによって処理されます。ファイルは、基礎となるビルドシステム( GNU Makenmakeなど )によって処理されます。

プロジェクトに「myapp」という名前を付けた場合は、「myapp.pro」ファイルが表示されます。このようなデフォルトファイルは、コメントとともにqmake変数を記述したように見えます。

# Tells build system that project uses Qt Core and Qt GUI modules.
QT       += core gui

# Prior to Qt 5 widgets were part of Qt GUI module. In Qt 5 we need to add Qt Widgets module.
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

# Specifies name of the binary.
TARGET = myapp

# Denotes that project is an application.
TEMPLATE = app

# List of source files (note: Qt Creator will take care about this list, you don't need to update is manually).
SOURCES += main.cpp\
        mainwindow.cpp

# List of header files (note: Qt Creator will take care about this list).
HEADERS  += mainwindow.h

# List of "ui" files for a tool called Qt Designer, which is embedded into Qt Creator in newer versions of IDE (note: Qt Creator will take care about this list).
FORMS    += mainwindow.ui

ビルドでのソースディレクトリ構造の保護(ドキュメント化されていない "object_parallel_to_source"オプション)。

ソースファイルを別のサブディレクトリに保存してプロジェクトを整理する場合は、ビルド中にqmakeがこのディレクトリ構造を保持せず、すべての ".o"ファイルを単一のビルドディレクトリに保持することを知っておくべきです。これは、次のように異なるディレクトリにファイル名が衝突した場合に問題になります。

src/file1.cpp
src/plugin/file1.cpp

これでqmakeは2つの "file1.o"ファイルをビルドディレクトリに作成し、そのうちの1つを別のファイルに上書きすることになります。 buldは失敗します。これを防ぐには、 "pro"ファイルにCONFIG += object_parallel_to_source設定オプションを追加します。これにより、 qmakeはソースディレクトリ構造を保持するビルドファイルを生成するようになります。このように、ビルドディレクトリにはソースディレクトリ構造が反映され、オブジェクトファイルは別々のサブディレクトリに作成されます。

src/file1.o
src/plugin/file1.o

完全な例。

QT += core
TARGET = myapp
TEMPLATE = app

CONFIG += object_parallel_to_source

SOURCES += src/file1.cpp \
           src/plugin/file1.cpp

HEADERS  += src/plugin/file1.h

object_parallel_to_source CONFIGオプションは正式に文書化されていないことに注意してください。

簡単な例(Linux)

Window.h

#include <QWidget>

class Window : public QWidget
{
    Q_OBJECT
public:
    Window(QWidget *parent = Q_NULLPTR) : QWidget(parent) {}
}

main.cpp

#include <QApplication>
#include "Window.h"

int main()
{
    QApplication app;
    Window window;
    window.show();
    return app.exec();
}

example.pro

# The QT variable controls what modules are included in compilation.
# Note that the 'core' and 'gui' modules are included by default.
# For widget-based GUI applications, the 'widgets' module needs to be added.
QT += widgets  

HEADERS = Window.h # Everything added to the HEADER variable will be checked 
                   # to see if moc needs to run on it, and it will be run if
                   # so.

SOURCES = main.cpp # Everything added to the SOURCES variable will be compiled
                   # and (in the simple example) added to the resulting
                   # executable.

コマンドライン

# Assuming you are in a folder that contains the above files.
> qmake         # You can also add the example.pro file if needed
> make          # qmake creates a Makefile, this runs make on it.
> ./example     # The name of the executable defaults to the .pro file name.

SUBDIRSの例

qmakeのSUBDIRS機能は、それぞれ別のライブラリに依存する一連のライブラリをコンパイルするために使用できます。以下の例は、SUBDIRS能力のバリエーションを示すために少し畳み込まれています。

ディレクトリ構造

以下のファイルの一部は、簡潔にするために省略されています。それらは、非サブディレクトリの例としての形式とみなすことができます。

project_dir/
-project.pro
-common.pri
-build.pro
-main.cpp
-logic/
----logic.pro
----some logic files
-gui/
----gui.pro
----gui files

project.pro

この例を可能にする主なファイルです。これはコマンドラインでqmakeを使って呼び出されるファイルでもあります(下記参照)。

TEMPLATE = subdirs  # This changes to the subdirs function.  You can't combine 
                    # compiling code and the subdirs function in the same .pro
                    # file.

# By default, you assign a directory to the SUBDIRS variable, and qmake looks
# inside that directory for a <dirname>.pro file.
SUBDIRS = logic

# You can append as many items as desired.  You can also specify the .pro file
# directly if need be.
SUBDIRS += gui/gui.pro

# You can also create a target that isn't a subdirectory, or that refers to a
# different file(*).
SUBDIRS += build
build.file = build.pro # This specifies the .pro file to use
# You can also use this to specify dependencies.  In this case, we don't want 
# the build target to run until after the logic and gui targets are complete.
build.depends = logic gui/gui.pro

(*)サブディレクトリターゲットのその他のオプションについては、 リファレンスドキュメントを参照してください。

common.pri

#Includes common configuration for all subdirectory .pro files.
INCLUDEPATH += . ..
WARNINGS += -Wall

TEMPLATE = lib

# The following keeps the generated files at least somewhat separate 
# from the source files.
UI_DIR = uics
MOC_DIR = mocs
OBJECTS_DIR = objs

ロジック/ロジック.pro

# Check if the config file exists
! include( ../common.pri ) {
    error( "Couldn't find the common.pri file!" )
}

HEADERS += logic.h
SOURCES += logic.cpp

# By default, TARGET is the same as the directory, so it will make 
# liblogic.so (in linux).  Uncomment to override.
# TARGET = target

gui / gui.pro

! include( ../common.pri ) {
    error( "Couldn't find the common.pri file!" )
}

FORMS += gui.ui
HEADERS += gui.h
SOURCES += gui.cpp

# By default, TARGET is the same as the directory, so it will make 
# libgui.so (in linux).  Uncomment to override.
# TARGET = target

build.pro

TEMPLATE = app

SOURCES += main.cpp

LIBS += -Llogic -Lgui -llogic -lgui

# This renames the resulting executable
TARGET = project

コマンドライン

# Assumes you are in the project_dir directory
> qmake project.pro # specific the .pro file since there are multiple here.
> make -n2 # This makes logic and gui concurrently, then the build Makefile.
> ./project # Run the resulting executable.

ライブラリの例

ライブラリを作る簡単な例(デフォルトである実行可能ファイルではなく)。 TEMPLATE変数は、作成しているプロジェクトのタイプを指定します。 libオプションは、makefileがライブラリを構築することを可能にします。

library.pro

HEADERS += library.h
SOURCES += library.cpp

TEMPLATE = lib

# By default, qmake will make a shared library.  Uncomment to make the library 
# static.
# CONFIG += staticlib

# By default, TARGET is the same as the directory, so it will make 
# liblibrary.so or liblibrary.a (in linux).  Uncomment to override.
# TARGET = target

ライブラリを構築するときに、オプションdll (デフォルト)、 staticlibまたはpluginCONFIG追加できます。

既存のコードからプロジェクトファイルを作成する

既存のソースファイルを持つディレクトリがある場合は、 qmake-project -optionとともに使用してプロジェクトファイルを作成できます。

フォルダMyProgramには次のファイルが含まれているとします。

  • main.cpp
  • foo.h
  • foo.cpp
  • bar.h
  • bar.cpp
  • subdir / foobar.h
  • サブディレクトリ/ foobar.cpp

その後、呼び出して

qmake -project

ファイルMyProgram.proが次の内容で作成されます。

######################################################################
# Automatically generated by qmake (3.0) Mi. Sep. 7 23:36:56 2016
######################################################################

TEMPLATE = app
TARGET = MyProgram
INCLUDEPATH += .

# Input
HEADERS += bar.h foo.h subdir/foobar.h
SOURCES += bar.cpp foo.cpp main.cpp subdir/foobar.cpp

この単純な例で説明したように、コードを構築することができます。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow