我可以使用 Qt 而不使用 qmake 或 Qt 创建程序吗?

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

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

48033 次浏览

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

引自 电脑手册:

下面是一个有用的 makefile 规则 只能使用 GNU make:

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

我个人将输出命名为 %.moc.cpp(而不是 m%.cpp) ,然后在 my_prog.moc.cpp上添加 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_OBJECT宏,以支持信号/槽语法。这种语法不是常规的 C + + 语法,不能使用 g + + 编译。包含带有 Q_OBJECT的类定义的文件必须通过 Qt 的 元对象编译器运行,这个 元对象编译器称为 moc。这意味着您必须确定哪些文件需要将 moc应用到它们,然后对它们运行 moc,然后用 g++编译生成的 cpp 文件。这就是 Qt 提供 qmake的原因。它在 Makefile 中为您生成正确的规则。

Pro 项目文件使用起来非常简单,我强烈建议您使用它们。 记住,qmake是一个命令行工具,就像 g++一样。此外,它实际上可以通过提供 -project选项为您创建一个框架项目文件,这样您就可以开始了

qmake -project
qmake
make

你就完了。在实践中,我发现生成的项目文件可能缺少我可能使用的任何额外 Qt 库的声明,因此您可能必须添加一行

QT += opengl

例如,如果您已经包含了类似 QGLWidget的内容。

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

下面是不使用 qmake 的任何 Qt 项目的 makefile:

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

在这里,motool 是一个帮助非 QObject 头的简单工具,下面是它的源代码:

Https://github.com/quent42340/easylib/blob/master/tools/moctool/source/main.cpp

我喜欢用 Qt 编程使用 Vim 和简化版本的 Qt 设计器... 最后一个帮助我制作窗口原型... 然后我翻译的层次结构从 Qt 设计器到我的手工编码的窗口头在 Vim..。

结果是我所有的代码都由我自己维护。.没有。没有。Cpp..没有 ui 指针... 这样我就可以自由操作代码了。