Могу ли я использовать Qt без qmake или Qt Creator?
Я хочу программировать с помощью Qt, но я не хочу использовать специальные компиляторы или IDE, такие как Qt Creator и qmake. Я хочу писать с Кейт и компилировать с g++.
могу ли я скомпилировать программу, которая использует Qt с g++? Как мне скомпилировать его с помощью g++?
4 ответов:
конечно, вы можете. Хотя это более удобно с 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_progonmy_prog.moc.cppmy_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на них, а затем скомпилировать полученный cpp файл сg++. Это является причиной того, что поставки в Qtqmake. Он генерирует правильные правила в файле Makefile для вас.файлы проекта Qt. pro действительно довольно просты в работе, и я бы серьезно рекомендуется использовать их. Помни,
qmakeинструмент командной строки, какg++. Кроме того, он может фактически создать файл проекта скелета для вас, поставив Итак, для начала вы можете просто сделатьqmake -project qmake makeи вы сделали. На практике я нахожу, что в сгенерированном файле проекта может отсутствовать объявление любых дополнительных библиотек Qt, которые я мог бы использовать, поэтому вам, возможно, придется добавить строку типа
QT += openglесли, например, вы включили что-то вроде
QGLWidget.
вот мой makefile для любого проекта 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 $@ ] || 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 удобно делать такие вещи и генерировать makefile для компиляторов g++ или msvc.
Comments