web-dev-qa-db-ja.com

qmakeまたはQt CreatorなしでQtを使用できますか?

Qtを使用してプログラミングしたいが、Qt Creatorやqmakeなどの特別なコンパイラやIDEを使用したくない。Kateで記述し、g ++でコンパイルしたい。

Qtをg ++で使用するプログラムをコンパイルできますか? g ++でコンパイルするにはどうすればよいですか?

70
Squall

もちろんできます。 qmakeまたはCMakeの方が便利ですが、次のことができます。

CXXFLAGS += -Ipath_to_your_qt_includes
LDFLAGS += -Lpath_to_your_qt_libs

LDLIBS += -lqt-mt (for Qt3)

または

LDLIBS += -lQtCore -lQtGui (for Qt4, add what you need)

my_prog: my_prog.cpp

(メイクファイル内)

更新-mocの呼び出し:

moc manpage からの引用:

GNU makeのみを使用する場合の便利なmakefileルールを次に示します。

m%.cpp: %.h
        moc $< -o $@

%.moc.cppm%.cppより)ではなく、個人的に出力に名前を付けます。次に、my_progの依存関係をmy_prog.moc.cppに追加します

my_prog: my_prog.cpp my_prog.moc.cpp

ic の場合も同様です。ヘッダーおよびソースファイルのルールを生成する必要があり、ヘッダーファイルに依存関係を追加して確認する必要があるため、ここでの状況はより複雑です。ソースがコンパイルされる前に生成されます。このような何かが動作する可能性があります:

my_prog: my_prog.o my_prog.moc.o my_prog.ui.o
        $(CXX)  $(LDFLAGS) -o my_prog $^ $(LDLIBS)

my_prog.o: my_prog.cpp my_prog.ui.h
38
jpalecek

もちろん、QtCreatorを使用してQtプログラムを作成する必要はありません。

また、qmakeを使用する必要はありませんが、使用しないことで問題を求めています。

Qtで少しでも面白いことをするには、必然的にQObjectをサブクラス化することになります。これらすべてのサブクラスの定義には、シグナル/スロット構文を有効にするQ_OBJECTマクロが必要です。この構文は通常のC++ではなく、g ++を使用してコンパイルできません。 Q_OBJECTのクラス定義を含むファイルは、Qtの メタオブジェクトコンパイラ を介して実行する必要があります。これはmocと呼ばれます。つまり、どのファイルにmocを適用する必要があるかを判断し、それらに対してmocを実行し、g++を使用して結果のcppファイルをコンパイルする必要があります。これが、Qtがqmakeを提供する理由です。 Makefileに正しいルールを生成します。

Qt .proプロジェクトファイルは本当に簡単に使用できます。使用することを真剣にお勧めします。 qmakeg++と同様のコマンドラインツールであることに注意してください。また、-projectオプションを指定することにより、実際にスケルトンプロジェクトファイルを作成することができます。

qmake -project
qmake
make

これで完了です。実際には、生成されたプロジェクトファイルには、使用している可能性のある追加のQtライブラリの宣言がないため、次のような行を追加する必要があります。

QT += opengl

たとえば、QGLWidgetのようなものを含めた場合。

20
Troubadour

以下に、qmakeを使用しないQtプロジェクトのメイクファイルを示します。

#---------------------------------------------------------------------------------
# Compiler executables
#---------------------------------------------------------------------------------
CC      :=  gcc
CXX     :=  g++

#---------------------------------------------------------------------------------
# Options for code generation
#---------------------------------------------------------------------------------
DEFINES :=  -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED
CFLAGS  :=  -g -Wall $(DEFINES)
CXXFLAGS:=  $(CFLAGS)
LDFLAGS :=  -g -Wl

#---------------------------------------------------------------------------------
# Any extra libraries you wish to link with your project
#---------------------------------------------------------------------------------
LIBS    :=  -lQtGui -lQtCore -lpthread

#---------------------------------------------------------------------------------
# Some more include paths
#---------------------------------------------------------------------------------
INCPATHS:=  -I/usr/share/qt4/mkspecs/default -I/usr/include/QtGui -I/usr/include/QtCore

#---------------------------------------------------------------------------------
# Source folders and executable name
#---------------------------------------------------------------------------------
TARGET  :=  $(Shell basename $(CURDIR))
BUILD   :=  build
SOURCES :=  source
INCLUDES:=  source include

#---------------------------------------------------------------------------------
# Source files
#---------------------------------------------------------------------------------
ifneq ($(BUILD),$(notdir $(CURDIR)))
#---------------------------------------------------------------------------------
export OUTPUT   :=  $(CURDIR)/$(TARGET)

export VPATH    :=  $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
                    $(foreach dir,$(INCLUDES),$(CURDIR)/$(dir))

CFILES      :=  $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
CPPFILES    :=  $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
HFILES      :=  $(foreach dir,$(INCLUDES),$(notdir $(wildcard $(dir)/*.h)))

#---------------------------------------------------------------------------------
# Use CXX for linking C++ projects, CC for standard C
#---------------------------------------------------------------------------------
ifeq ($(strip $(CPPFILES)),)
#---------------------------------------------------------------------------------
    export LD   :=  $(CC)
#---------------------------------------------------------------------------------
else
#---------------------------------------------------------------------------------
    export LD   :=  $(CXX)
#---------------------------------------------------------------------------------
endif
#---------------------------------------------------------------------------------

export OFILES   :=  $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(HFILES:.h=.moc.o)

export INCLUDE  :=  $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) $(INCPATHS)

#---------------------------------------------------------------------------------
.PHONY: $(BUILD) clean install uninstall
#------------------------------------------------------------------------------
$(BUILD):
    @[ -d $@ ] || mkdir -p $@
    @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile

#---------------------------------------------------------------------------------
clean:
    @echo clean ...
    @rm -fr $(BUILD) $(TARGET)

#---------------------------------------------------------------------------------
install:
    @cp -u $(TARGET) /usr/bin/$(TARGET)
    @echo installed.

#---------------------------------------------------------------------------------
uninstall:
    @rm -f /usr/bin/$(TARGET)
    @echo uninstalled.

#---------------------------------------------------------------------------------
else
#---------------------------------------------------------------------------------
# Makefile targets
#---------------------------------------------------------------------------------
all: $(OUTPUT)

#---------------------------------------------------------------------------------
$(OUTPUT): $(OFILES)
    @echo built ... $(notdir $@)
    @$(LD) $(LDFLAGS) $(OFILES) -o $@ $(LIBS)

#---------------------------------------------------------------------------------
%.o: %.c
#---------------------------------------------------------------------------------
    @echo $(notdir $<)
    @$(C) $(CFLAGS) $(INCLUDE) -c $< -o $@

#---------------------------------------------------------------------------------
%.o: %.cpp
#---------------------------------------------------------------------------------
    @echo $(notdir $<)
    @$(CXX) $(CXXFLAGS) $(INCLUDE) -c $< -o $@

#---------------------------------------------------------------------------------
%.moc.cpp: %.h
#---------------------------------------------------------------------------------
    @echo $(notdir $<)
    @moctool $< $(DEFINES) $(INCLUDE) -o $@

#---------------------------------------------------------------------------------
%.moc.o: %.moc.cpp
#---------------------------------------------------------------------------------
    @echo $(notdir $<)
    @$(CXX) $(CXXFLAGS) $(INCLUDE) -c $< -o $@

#---------------------------------------------------------------------------------
endif
#---------------------------------------------------------------------------------

ここで、moctoolは非QObjectヘッダーに役立つシンプルなツールです。ソースコードは次のとおりです。

https://github.com/Quent42340/EasyLib/blob/master/tools/moctool/source/main.cpp

6
Quent42340

Moc、uicなどのQtプロジェクトには、いくつかのプリコンパイラが必要です。 Qt Creator + qmakeは、このようなことを行い、g ++またはmsvcコンパイラー用のmakefileを生成するのに便利です。

0
AechoLiu