Могу ли я использовать Qt без qmake или Qt Creator?



Я хочу программировать с помощью Qt, но я не хочу использовать специальные компиляторы или IDE, такие как Qt Creator и qmake. Я хочу писать с Кейт и компилировать с g++.



могу ли я скомпилировать программу, которая использует Qt с g++? Как мне скомпилировать его с помощью g++?

898   4  

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

вам, конечно, не нужно использовать QtCreator для написания программы Qt.

вы также не должны использовать qmake но вы напрашиваетесь на неприятности, не используя его.

чтобы сделать что-нибудь даже отдаленно интересное в Qt, вы неизбежно закончите подклассом QObject. Все эти подклассы требуют Q_OBJECT макрос в их определении, которое включает синтаксис сигнала / слота. Этот синтаксис не является обычным C++ и не может быть скомпилирован с помощью g++. Файлы, содержащие класс определения с Q_OBJECT должен быть запущен через Qt мета-объектный компилятор, которая называется moc. Это означает, что вы должны решить, какие файлы должны иметь moc применяется к ним, а затем запустить moc на них, а затем скомпилировать полученный cpp файл с g++. Это является причиной того, что поставки в Qt qmake. Он генерирует правильные правила в файле 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

    Ничего не найдено.