我可以在没有qmake或Qt Creator的情况下使用Qt吗?

我想使用Qt编程,但我不想使用特殊的编译器或IDE,如Qt Creator和qmake。 我想用Kate编写并用g ++编译。

我可以编译一个使用Q ++与g ++的程序吗? 如何用g ++编译它?

你当然可以。 虽然使用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 

(在makefile中)

更新 – 调用moc

从moc手册页引用:

如果你只使用GNU make,这是一个有用的makefile规则:

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

我个人命名输出,而不是%.moc.cpp (比m%.cpp )。 然后在my_prog上添加my_prog的依赖关系

 my_prog: my_prog.cpp my_prog.moc.cpp 

同样为uic 。 这里的情况比较复杂,因为您必须为头文件源文件生成规则,并且必须在头文件中添加依赖项,以确保在编译源文件之前生成头文件。 像这样的东西可能会工作:

 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 

您当然不必使用QtCreator编写Qt程序。

你也不需要使用qmake但是你没有使用它而要求麻烦。

为了在Qt中做任何有趣的事情,你最终都将不得不QObject子类。 所有这些子类在它们的定义中都需要Q_OBJECTmacros,这使得信号/插槽语法成为可能。 这个语法不是普通的C ++,不能用g ++编译。 包含具有Q_OBJECT类定义的文件必须通过称为moc Qt的元对象编译器运行。 这意味着你必须确定哪些文件需要应用moc ,然后运行moc ,然后用g++编译生成的cpp文件。 这就是Qt提供qmake的原因。 它会为你在Makefile中生成正确的规则。

Qt .pro项目文件真的很简单,我会认真地build议你使用它们。 请记住, qmake是一个像g++一样的命令行工具。 另外,它实际上可以通过提供-project选项为您创build一个框架项目文件,以便开始您可以做的事情

 qmake -project qmake make 

你完成了。 在实践中,我发现生成的项目文件可能会丢失我可能使用的任何额外的Qt库的声明,所以你可能需要添加一行

 QT += opengl 

例如,如果你已经包含了像QGLWidget这样的东西。

这里是我的任何Qt项目的makefile,而不使用qmake:

 #--------------------------------------------------------------------------------- # 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

一些预编译器是Qt projcet所必需的,比如moc,uic,…等等。 Qt Creator + qmake可以方便地执行这些操作,并为g ++或msvc编译器生成makefile。