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

Squ*_*all 70 c++ qt compilation

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

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

jpa*_*cek 39

你当然可以.虽然使用qmake或CMake更方便,但您可以:

CXXFLAGS += -Ipath_to_your_qt_includes
LDFLAGS += -Lpath_to_your_qt_libs

LDLIBS += -lqt-mt (for Qt3)
Run Code Online (Sandbox Code Playgroud)

要么

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

my_prog: my_prog.cpp
Run Code Online (Sandbox Code Playgroud)

(在makefile中)

更新 - 调用moc:

moc手册页引用:

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

m%.cpp: %.h
        moc $< -o $@
Run Code Online (Sandbox Code Playgroud)

我个人将输出命名为%.moc.cpp(而不是m%.cpp).然后添加my_progon 的依赖项my_prog.moc.cpp

my_prog: my_prog.cpp my_prog.moc.cpp
Run Code Online (Sandbox Code Playgroud)

同样对于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
Run Code Online (Sandbox Code Playgroud)

  • 此外,如果你使用Qt的扩展语法,如信号和插槽和东西,你需要手动运行moc.这是唯一的"强制"特殊编译器. (3认同)
  • 这个答案没有告诉你如何运行`moc`(它非常需要展示的东西) (2认同)

Tro*_*our 22

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

您也不必使用,qmake但是您不使用它就会遇到麻烦.

要在Qt中做任何有趣的事情,你将不可避免地最终进行子类化QObject.所有这些子类Q_OBJECT在其定义中都需要宏来启用信号/槽语法.此语法不是常规C++,不能使用g ++编译.包含类定义的文件Q_OBJECT必须通过调用的Qt 元对象编译器运行moc.这意味着您必须确定需要moc应用哪些文件,然后moc对它们运行,然后使用生成的cpp文件进行编译g++.这就是Qt供应的原因qmake.它会在Makefile中为您生成正确的规则.

Qt .pro项目文件非常简单易用,我会认真地建议您使用它们.请记住,这qmake是一个命令行工具g++.此外,它实际上可以通过提供-project选项为您创建一个骨架项目文件,以便您可以开始使用

qmake -project
qmake
make
Run Code Online (Sandbox Code Playgroud)

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

QT += opengl
Run Code Online (Sandbox Code Playgroud)

例如,如果您包含类似的内容QGLWidget.

  • 这个答案有误导性。Qmake 是一个构建工具,独立于 moc。您可以成功且轻松地从不同的构建工具调用 moc。例如,我已经在 Visual Studio 和 SCons 中完成了此操作。两者都易于透明地处理,以便您可以照常进行,就好像 moc 不存在一样。 (3认同)
  • 出于所有的意图和目的,Qt在没有QMake的情况下毫无用处.很好的答案. (2认同)
  • “ Q_OBJECT ...此语法不是常规C ++”。这只是一个宏,而且是完全有效的C ++。宏所做的只是声明一堆函数。moc编译提供了定义。 (2认同)

小智 7

这是我没有使用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
#---------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

在这里,moctool是一个简单的工具,可以帮助非QObject头,这里是它的源代码:

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