Program Tip

qmake 또는 Qt Creator없이 Qt를 사용할 수 있습니까?

programtip 2020. 11. 2. 08:21
반응형

qmake 또는 Qt Creator없이 Qt를 사용할 수 있습니까?


Qt를 사용하여 프로그래밍하고 싶지만 Qt Creator 및 qmake와 같은 특수 컴파일러 또는 IDE를 사용하고 싶지 않습니다. Kate로 작성하고 g ++로 컴파일하고 싶습니다.

g ++로 Qt를 사용하는 프로그램을 컴파일 할 수 있습니까? g ++로 어떻게 컴파일합니까?


물론 넌 할 수있어. 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

(메이크 파일에서)

업데이트-호출 moc:

moc 맨 페이지 에서 인용 :

다음은 GNU make 만 사용하는 경우 유용한 makefile 규칙입니다.

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

개인적으로 출력의 이름을 %.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

Qt 프로그램을 작성하기 위해 QtCreator를 사용할 필요는 없습니다.

당신은 또한 사용할 qmake필요는 없지만 그것을 사용하지 않음으로써 문제를 요구하고 있습니다.

Qt에서 원격으로 흥미로운 작업을 수행하려면 필연적으로 서브 클래 싱을해야 QObject합니다. 이러한 모든 하위 클래스에는 Q_OBJECT신호 / 슬롯 구문을 활성화하는 정의에 매크로가 필요 합니다. 이 구문은 일반 C ++가 아니며 g ++를 사용하여 컴파일 할 수 없습니다. 클래스 정의를 포함하는 파일 은라는 Q_OBJECTQt의 메타 개체 컴파일러통해 실행되어야합니다 moc. 즉, 어떤 파일을 moc적용 해야하는지 알아 내고 실행 moc한 다음 결과 cpp 파일을 g++. 이것이 Qt가 제공하는 이유입니다 qmake. Makefile에서 올바른 규칙을 생성합니다.

Qt .pro 프로젝트 파일은 작업하기가 매우 간단하며 사용하는 것이 좋습니다. 기억, qmake단지 같은 명령 줄 도구입니다 g++. 또한 -project옵션 을 제공하여 실제로 스켈레톤 프로젝트 파일을 생성 할 수 있으므로 시작하려면

qmake -project
qmake
make

그리고 당신은 끝났습니다. 실제로 생성 된 프로젝트 파일에 내가 사용할 수있는 추가 Qt 라이브러리의 선언이 누락 될 수 있으므로 다음과 같은 줄을 추가해야 할 수 있습니다.

QT += opengl

예를 들어 QGLWidget.


다음은 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


Some pre-compilers are necessary for Qt projcet, like moc, uic, ...,etc. Qt Creator + qmake are convenient to do such things and generate a makefile for g++ or msvc compilers.

참고URL : https://stackoverflow.com/questions/3632038/can-i-use-qt-without-qmake-or-qt-creator

반응형