Czy Mogę używać Qt bez qmake lub Qt Creator?

Chcę programować przy użyciu Qt, ale nie chcę używać specjalnych kompilatorów lub IDE, takich jak Qt Creator i qmake. Chcę pisać z Kate i kompilować z G++.

Czy Mogę skompilować program, który używa Qt z g++? Jak skompilować go z g++?

Author: genpfault, 2010-09-03

4 answers

Oczywiście, że możesz. Chociaż jest to wygodniejsze z qmake lub CMake, można zrobić:

CXXFLAGS += -Ipath_to_your_qt_includes
LDFLAGS += -Lpath_to_your_qt_libs

LDLIBS += -lqt-mt (for Qt3)

Lub

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

my_prog: my_prog.cpp

(w pliku makefile)

Aktualizacja-wywołanie moc:

Cytat z moc strony Man :

Oto przydatna reguła makefile, jeśli używaj tylko GNU make:

m%.cpp: %.h
        moc $< -o $@

Osobiście nazwałbym wyjście raczej %.moc.cpp (niż m%.cpp). Następnie dodajesz zależność my_prog na my_prog.moc.cpp

my_prog: my_prog.cpp my_prog.moc.cpp

Podobnie dla uic. Sytuacja tutaj jest bardziej skomplikowana, ponieważ musisz wygenerować reguły dla plików źródłowych nagłówków i oraz dodać zależność od pliku nagłówkowego, aby upewnić się, że zostanie on wygenerowany przed kompilacją źródeł. Coś takiego może zadziałać:

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
 37
Author: jpalecek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-03 01:00:27

Na pewno nie musisz używać QtCreator do pisania programu Qt.

Nie musisz również używać qmake, ale prosisz o kłopoty, nie używając go.

Aby zrobić cokolwiek choć trochę interesującego w Qt, nieuchronnie skończysz jako subclassing QObject. Wszystkie te podklasy wymagają makra Q_OBJECT w swojej definicji, które umożliwia składnię sygnału / slotu. Ta składnia nie jest zwykłym C++ i nie może być skompilowana przy użyciu g++. Pliki zawierające definicje klas z Q_OBJECT muszą być uruchomione za pomocą kompilatora Meta-obiektu Qt, który nazywa się moc. Oznacza to, że musisz ustalić, które Pliki muszą mieć moc zastosowane do nich, następnie uruchomić moc na nich, a następnie skompilować wynikowy plik cpp za pomocą g++. Z tego powodu QT dostarcza qmake. Generuje odpowiednie reguły w pliku Makefile dla Ciebie.

Pliki projektu Qt. pro są naprawdę dość proste w obsłudze i szczerze polecam korzystanie z nich. Pamiętaj, że {[2] } jest narzędziem wiersza poleceń tak jak g++. Ponadto, może faktycznie utworzyć szkielet pliku projektu dla Ciebie, dostarczając opcję -project, więc aby rozpocząć, możesz po prostu zrobić

qmake -project
qmake
make
I jesteś skończony. W praktyce okazuje się, że wygenerowany plik projektu może brakować deklaracji jakichkolwiek dodatkowych bibliotek Qt, których mogę używać, więc być może będziesz musiał dodać wiersz w stylu
QT += opengl

Jeśli, na przykład, dołączyłeś coś w rodzaju QGLWidget.

 19
Author: Troubadour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-12 21:40:39

Oto mój plik makefile dla dowolnego projektu Qt bez użycia 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
#---------------------------------------------------------------------------------

Tutaj moctool jest prostym narzędziem, które pomaga w nagłówkach innych niż QObject, oto jego kod źródłowy:

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

 5
Author: Quent42340,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-02 15:05:40

Niektóre Pre-Kompilatory są niezbędne dla Qt projcet, jak moc, uic,..., itd. Qt Creator + qmake są wygodne do robienia takich rzeczy i generowania pliku makefile dla kompilatorów g++ lub msvc.

 0
Author: AechoLiu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-03 01:53:57