Qt 프로젝트가 있고 소스 트리 외부에 컴파일 파일을 출력하고 싶습니다.
현재 다음과 같은 디렉토리 구조가 있습니다.
/
|_/build
|_/mylib
|_/include
|_/src
|_/resources
구성 (디버그 / 릴리스)에 따라 빌드 / 디버그 또는 빌드 / 릴리스 디렉토리 아래의 빌드 디렉토리에 결과 파일을 출력하고 싶습니다.
.pro 파일을 사용하여 어떻게 할 수 있습니까?
Qt 프로젝트가 있고 소스 트리 외부에 컴파일 파일을 출력하고 싶습니다.
현재 다음과 같은 디렉토리 구조가 있습니다.
/
|_/build
|_/mylib
|_/include
|_/src
|_/resources
구성 (디버그 / 릴리스)에 따라 빌드 / 디버그 또는 빌드 / 릴리스 디렉토리 아래의 빌드 디렉토리에 결과 파일을 출력하고 싶습니다.
.pro 파일을 사용하여 어떻게 할 수 있습니까?
답변:
짧은 대답은 : 당신은하지 않습니다 .
빌드하려는 빌드 디렉토리에서 qmake
다음을 실행해야합니다 make
. 따라서 debug
디렉토리에서 한 번 , 디렉토리에서 한 번 실행하십시오 release
.
이것이 바로 프로젝트를 빌드하는 모든 사람이 작업을 기대하는 방식이며, Qt 자체가 빌드를 위해 설정되는 방식이며, Qt Creator가 .pro
파일이 작동 할 것으로 예상하는 방식이기도합니다. 파일이 시작된 qmake
다음 make
대상이 선택한 구성을위한 빌드 폴더에 있습니다.
이러한 폴더를 생성하고 그 안에 두 개 (또는 그 이상)의 빌드를 수행하려면, qmake를 통해 최상위 프로젝트 파일에서 생성 된 최상위 makefile이 필요합니다.
빌드 구성이 두 개 이상인 것은 드문 일이 아니므로 빌드와 릴리스를 구분하는 데 불필요하게 헌신하고 있습니다. 최적화 수준이 다른 빌드가있을 수 있습니다 . 디버그 / 릴리스 이분법은 편히 쉬는 것이 가장 좋습니다.
내 Qt 프로젝트의 경우 * .pro 파일에서이 체계를 사용합니다.
HEADERS += src/dialogs.h
SOURCES += src/main.cpp \
src/dialogs.cpp
Release:DESTDIR = release
Release:OBJECTS_DIR = release/.obj
Release:MOC_DIR = release/.moc
Release:RCC_DIR = release/.rcc
Release:UI_DIR = release/.ui
Debug:DESTDIR = debug
Debug:OBJECTS_DIR = debug/.obj
Debug:MOC_DIR = debug/.moc
Debug:RCC_DIR = debug/.rcc
Debug:UI_DIR = debug/.ui
간단하지만 멋지다! :)
DESTDIR
조건부로 s 만 정의한 다음 다른 모든 경로에서 해당 값을 사용하십시오 OBJECTS_DIR = $${DESTDIR}/.obj
. 건배!
Debug
에 debug
와 Release
에 release
.
대상 dll / exe의 디렉토리를 변경하려면 pro 파일에서 다음을 사용하십시오.
CONFIG(debug, debug|release) {
DESTDIR = build/debug
} else {
DESTDIR = build/release
}
또한 오브젝트 파일 및 moc 파일과 같은 다른 빌드 대상에 대한 디렉토리를 변경할 수도 있습니다 ( 자세한 내용은 qmake 변수 참조 또는 qmake CONFIG () 함수 참조 ).
OBJECTS_DIR = $$DESTDIR/.obj MOC_DIR = $$DESTDIR/.moc RCC_DIR = $$DESTDIR/.qrc UI_DIR = $$DESTDIR/.ui
CONFIG()
턴 아웃 사용하는 몇 가지 문제를 해결하기 위해 release:
와debug:
더 간결한 접근 방식이 있습니다.
release: DESTDIR = build/release
debug: DESTDIR = build/debug
OBJECTS_DIR = $$DESTDIR/.obj
MOC_DIR = $$DESTDIR/.moc
RCC_DIR = $$DESTDIR/.qrc
UI_DIR = $$DESTDIR/.ui
이를 수행하는 올바른 방법은 다음과 같습니다 (QT 지원 팀에 감사드립니다).
CONFIG(debug, debug|release) {
DESTDIR = build/debug
}
CONFIG(release, debug|release) {
DESTDIR = build/release
}
OBJECTS_DIR = $$DESTDIR/.obj
MOC_DIR = $$DESTDIR/.moc
RCC_DIR = $$DESTDIR/.qrc
UI_DIR = $$DESTDIR/.u
나는 chalup이 제안한 것과 같은 방법을 사용합니다.
ParentDirectory = <your directory>
RCC_DIR = "$$ParentDirectory\Build\RCCFiles"
UI_DIR = "$$ParentDirectory\Build\UICFiles"
MOC_DIR = "$$ParentDirectory\Build\MOCFiles"
OBJECTS_DIR = "$$ParentDirectory\Build\ObjFiles"
CONFIG(debug, debug|release) {
DESTDIR = "$$ParentDirectory\debug"
}
CONFIG(release, debug|release) {
DESTDIR = "$$ParentDirectory\release"
}
오래된 질문이지만 여전히 최신 답변의 가치가 있습니다. 오늘날에는 섀도우 빌드를 사용할 때 Qt Creator가 수행하는 작업을 수행하는 것이 일반적입니다 (새 프로젝트를 열 때 기본적으로 활성화 됨).
각 빌드 대상 및 유형에 대해 권한 qmake
은 다른 빌드 디렉토리에서 올바른 인수로 실행됩니다. 그런 다음 간단한 make
.
따라서 가상의 디렉토리 구조는 다음과 같습니다.
/
|_/build-mylib-qt5-mingw32-debug
|_/build-mylib-qt5-mingw32-release
|_/build-mylib-qt4-msvc2010-debug
|_/build-mylib-qt4-msvc2010-release
|_/build-mylib-qt5-arm-debug
|_/build-mylib-qt5-arm-release
|_/mylib
|_/include
|_/src
|_/resources
그리고 중요한 것은 a qmake
가 빌드 디렉토리에서 실행 된다는 것입니다 .
cd build-mylib-XXXX
/path/to/right/qmake ../mylib/mylib.pro CONFIG+=buildtype ...
그런 다음 빌드 디렉토리에 메이크 파일을 생성 한 다음 그 make
아래에 파일도 생성합니다. qmake가 소스 디렉토리에서 실행되지 않는 한 서로 다른 버전이 뒤섞 일 위험이 없습니다 (그렇다면 잘 정리하는 것이 좋습니다!).
그리고 이렇게하면 .pro
현재 승인 된 답변 의 파일이 더 간단 해집니다.
HEADERS += src/dialogs.h
SOURCES += src/main.cpp \
src/dialogs.cpp
$(OUT_PWD)
가 해결책일까요?
mylib
입니까? 이 작업을 수행하는 "우아한"방법이 있으면 좋겠습니다. 다른 답변의 기술을 사용하는 것 외에 다른 방법은 없습니다. 빌드 유형과 구성을 사용 LIBS
하여 현명한 방식으로 채우고 무효화 그림자 빌드의 장점.
include(../mylib/mylib.pri)
이것은 다른 디버그 / 릴리스 출력 디렉토리에 대한 내 Makefile입니다. 이 Makefile은 Ubuntu Linux에서 성공적으로 테스트되었습니다. Mingw-w64가 올바르게 설치된 경우 Windows에서 원활하게 작동합니다.
ifeq ($(OS),Windows_NT)
ObjExt=obj
mkdir_CMD=mkdir
rm_CMD=rmdir /S /Q
else
ObjExt=o
mkdir_CMD=mkdir -p
rm_CMD=rm -rf
endif
CC =gcc
CFLAGS =-Wall -ansi
LD =gcc
OutRootDir=.
DebugDir =Debug
ReleaseDir=Release
INSTDIR =./bin
INCLUDE =.
SrcFiles=$(wildcard *.c)
EXEC_main=myapp
OBJ_C_Debug =$(patsubst %.c, $(OutRootDir)/$(DebugDir)/%.$(ObjExt),$(SrcFiles))
OBJ_C_Release =$(patsubst %.c, $(OutRootDir)/$(ReleaseDir)/%.$(ObjExt),$(SrcFiles))
.PHONY: Release Debug cleanDebug cleanRelease clean
# Target specific variables
release: CFLAGS += -O -DNDEBUG
debug: CFLAGS += -g
################################################
#Callable Targets
release: $(OutRootDir)/$(ReleaseDir)/$(EXEC_main)
debug: $(OutRootDir)/$(DebugDir)/$(EXEC_main)
cleanDebug:
-$(rm_CMD) "$(OutRootDir)/$(DebugDir)"
@echo cleanDebug done
cleanRelease:
-$(rm_CMD) "$(OutRootDir)/$(ReleaseDir)"
@echo cleanRelease done
clean: cleanDebug cleanRelease
################################################
# Pattern Rules
# Multiple targets cannot be used with pattern rules [https://www.gnu.org/software/make/manual/html_node/Multiple-Targets.html]
$(OutRootDir)/$(ReleaseDir)/%.$(ObjExt): %.c | $(OutRootDir)/$(ReleaseDir)
$(CC) -I$(INCLUDE) $(CFLAGS) -c $< -o"$@"
$(OutRootDir)/$(DebugDir)/%.$(ObjExt): %.c | $(OutRootDir)/$(DebugDir)
$(CC) -I$(INCLUDE) $(CFLAGS) -c $< -o"$@"
# Create output directory
$(OutRootDir)/$(ReleaseDir) $(OutRootDir)/$(DebugDir) $(INSTDIR):
-$(mkdir_CMD) $@
# Create the executable
# Multiple targets [https://www.gnu.org/software/make/manual/html_node/Multiple-Targets.html]
$(OutRootDir)/$(ReleaseDir)/$(EXEC_main): $(OBJ_C_Release)
$(OutRootDir)/$(DebugDir)/$(EXEC_main): $(OBJ_C_Debug)
$(OutRootDir)/$(ReleaseDir)/$(EXEC_main) $(OutRootDir)/$(DebugDir)/$(EXEC_main):
$(LD) $^ -o$@