Могу ли я использовать Qt без qmake или Qt Creator?
Я хочу программировать с помощью Qt, но я не хочу использовать специальные компиляторы или IDE, такие как Qt Creator и qmake. Я хочу написать с Kate и скомпилировать с g++.
Можно ли скомпилировать программу, использующую Qt с g++? Как скомпилировать его с помощью g++?
Ответы
Ответ 1
Конечно. Хотя это удобно с 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 manpage:
Вот полезное правило makefile, если вы используйте только GNU make:
m%.cpp: %.h
moc $< -o [email protected]
Я бы назвал вывод скорее %.moc.cpp
(чем m%.cpp
). Затем вы добавляете зависимость my_prog
на 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
Ответ 2
Вам, конечно, не нужно использовать QtCreator для написания программы Qt.
Вам также не нужно использовать qmake
, но вы просите проблему, не используя его.
Чтобы сделать что-нибудь даже отдаленно интересное в Qt, вы неизбежно закончите подклассификацию QObject
. Все эти подклассы требуют макроса Q_OBJECT
в своем определении, которое позволяет синтаксис сигнала/слота. Этот синтаксис не является регулярным С++ и не может быть скомпилирован с использованием 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
.
Ответ 3
Вот мой make файл для любого проекта Qt без использования 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 [email protected] ] || mkdir -p [email protected]
@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 [email protected])
@$(LD) $(LDFLAGS) $(OFILES) -o [email protected] $(LIBS)
#---------------------------------------------------------------------------------
%.o: %.c
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(C) $(CFLAGS) $(INCLUDE) -c $< -o [email protected]
#---------------------------------------------------------------------------------
%.o: %.cpp
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) $(INCLUDE) -c $< -o [email protected]
#---------------------------------------------------------------------------------
%.moc.cpp: %.h
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@moctool $< $(DEFINES) $(INCLUDE) -o [email protected]
#---------------------------------------------------------------------------------
%.moc.o: %.moc.cpp
#---------------------------------------------------------------------------------
@echo $(notdir $<)
@$(CXX) $(CXXFLAGS) $(INCLUDE) -c $< -o [email protected]
#---------------------------------------------------------------------------------
endif
#---------------------------------------------------------------------------------
Здесь moctool - это простой инструмент, который помогает для заголовков, отличных от QObject, вот его исходный код:
https://github.com/Quent42340/EasyLib/blob/master/tools/moctool/source/main.cpp
Ответ 4
Некоторые предварительные компиляторы необходимы для Qt projcet, таких как moc, uic,... и т.д.
Qt Creator + qmake удобно делать такие вещи и генерировать make файл для компиляторов g++ или msvc.