我想使用Qt进行编程,但是我不想使用特殊的编译器或IDE,例如Qt Creator和qmake。我想用Kate编写并用g ++进行编译。
我可以编译使用Qt和g ++的程序吗?如何使用g ++进行编译?
我想使用Qt进行编程,但是我不想使用特殊的编译器或IDE,例如Qt Creator和qmake。我想用Kate编写并用g ++进行编译。
我可以编译使用Qt和g ++的程序吗?如何使用g ++进行编译?
Answers:
你当然可以。尽管使用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
on的依赖项my_prog.moc.cpp
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
moc
(它非常需要演示的内容)
您当然不必使用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
到此为止。在实践中,我发现生成的项目文件可能缺少我可能正在使用的任何其他Qt库的声明,因此您可能必须添加一行
QT += opengl
例如,如果您包含的内容QGLWidget
。
qmake
您将不必“确定需要将哪些文件moc
应用于它们,然后对它们运行moc”。我目前在一家有自己的构建系统的公司工作,它在moc
没有qmake
。
这是我不使用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
#---------------------------------------------------------------------------------
在这里,moctool是一个简单的工具,可帮助处理非QObject标头,这是其源代码:
https://github.com/Quent42340/EasyLib/blob/master/tools/moctool/source/main.cpp
ifneq ($(BUILD),$(notdir $(CURDIR)))
似乎正在检查是否从生成目录执行了makefile,否则,似乎@make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
在第71行调用了另一个。为什么?else
从all:
目标开始的在线93之后发生的所有事情,都是我所期望的。我希望OP会回应...