我有一個Qt項目,我想在源碼樹之外輸出編譯文件。如何在QMake .pro文件中指定不同的Debug/Release輸出目錄
目前,我有以下目錄結構:
/
|_/build
|_/mylib
|_/include
|_/src
|_/resources
根據不同的配置(調試/釋放),我會喜歡到構建目錄中生成的文件輸出下構建/調試或建立/釋放目錄。
我該如何使用.pro文件做到這一點?
我有一個Qt項目,我想在源碼樹之外輸出編譯文件。如何在QMake .pro文件中指定不同的Debug/Release輸出目錄
目前,我有以下目錄結構:
/
|_/build
|_/mylib
|_/include
|_/src
|_/resources
根據不同的配置(調試/釋放),我會喜歡到構建目錄中生成的文件輸出下構建/調試或建立/釋放目錄。
我該如何使用.pro文件做到這一點?
對於我的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',然後在所有其他路徑中使用該值:'OBJECTS_DIR = $$ {DESTDIR}/.obj'。乾杯! – 2012-03-07 04:16:12
介意解釋這是如何使用/它做了什麼?當我執行它時似乎沒有效果。 *編輯:*如果我更改調試調試(小寫)它的作品。我懷疑這是一個windows vs unix大小寫敏感的東西。 – notlesh 2012-12-31 18:14:04
我投票,因爲它在Windows上工作。在Linux上(Ubuntu 15.04,Qt 5.5.0),我不得不將'Debug'改爲'debug'並將'Release'改爲'release'。 – Jepessen 2015-07-21 12:20:16
要改變目標的dll/exe文件的目錄,在你的職業文件中使用此:
CONFIG(debug, debug|release) {
DESTDIR = build/debug
} else {
DESTDIR = build/release
}
您可能還需要更改像目標文件和建設部文件(檢查qmake variable reference的詳細信息等構建目標目錄或qmake CONFIG() function reference)。
但我發現包括$$ OUT_PWD更好這,所以DESTDIR = $$ OUT_PWD/debug – Ivo 2012-05-16 07:28:08
@Ivo:啊!謝謝!我一直在尋找哪個變量包含該路徑! :d – Cameron 2013-01-28 00:25:45
此之後,您可以添加像行:'OBJECTS_DIR = $$ DESTDIR/.OBJ MOC_DIR = $$ DESTDIR/.moc RCC_DIR = $$ DESTDIR/.qrc UI_DIR = $$ DESTDIR/.ui' 'CONFIG()'結果解決了使用'release:'和'debug:'的一些問題:' – 2015-04-01 03:29:43
我用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"
}
我有一個更緊湊的方法:
release: DESTDIR = build/release
debug: DESTDIR = build/debug
OBJECTS_DIR = $$DESTDIR/.obj
MOC_DIR = $$DESTDIR/.moc
RCC_DIR = $$DESTDIR/.qrc
UI_DIR = $$DESTDIR/.ui
它也是有用的爲輸出可執行稍有不同的名稱。你不能使用類似的東西:
release: Target = ProgramName
debug: Target = ProgramName_d
爲什麼它不工作不明確,但它不。但是:
CONFIG(debug, debug|release) {
TARGET = ProgramName
} else {
TARGET = ProgramName_d
}
只要CONFIG +=
行在它之前,這就行。
名稱是相反的方式,但它的工作原理 – 2017-10-20 12:39:05
老問題,但仍值得一個最新的答案。今天通常使用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
而且improtant的事情是,一個qmake
運行在build目錄:
cd build-mylib-XXXX
/path/to/right/qmake ../mylib/mylib.pro CONFIG+=buildtype ...
然後在build目錄生成的makefile,然後make
將在它生成的文件了。只要qmake從不在源目錄中運行(如果是,則更好地清理它!),就不會有不同版本混淆的風險。
當這樣做,從目前接受的答案的.pro
文件更簡單:
HEADERS += src/dialogs.h
SOURCES += src/main.cpp \
src/dialogs.cpp
作品對於單個項目來說很好,但如果你有一個項目和一個圖書館呢?然後,您需要一個包含庫afaics的依賴於構建類型的方式。 – Adversus 2015-02-15 09:30:41
@Adversus我不確定你的意思,但也許Qmake變量'$(OUT_PWD)'是解決方案? – hyde 2015-02-15 10:31:17
當我將我的問題應用於您的示例時,它變爲:應用程序拾取「mylib」的最簡潔方式是什麼?我喜歡它,如果有一個「優雅」的方式來做到這一點,我沒有看到除了使用其他答案的技術之外的其他方法:使用構建類型和配置來填充智能中的LIBS方式,取消陰影構建的優勢。 – Adversus 2015-02-16 10:56:27
做到這一點,正確的方法是以下(感謝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
非常好的一點! :) – Tarod 2016-01-14 12:44:03
簡短的回答是:你不要。
您應該運行,隨後在任何build目錄你想建立的。所以,在debug
目錄中release
目錄運行一次,一次make
qmake
。
那怎麼有人構建項目會期望它的工作,這就是Qt的本身如何設置建立,這也是Qt Creator的期望如何你.pro
文件的行爲:它只是開始qmake
,然後make
build文件夾中爲您的目標的選擇配置。
如果您希望創建這些文件夾並在其中執行兩個(或更多)構建,則需要一個頂級makefile,可能通過qmake從頂級項目文件創建。
擁有兩個以上的構建配置並不罕見,因此您不必要承諾區分構建和發佈;你可能會建立不同的優化級別,等等。調試/釋放二分法是最好的安息。
Qt Creator的新版本在調試和發佈之間還有一個「配置文件」構建選項。以下是我如何檢測到:
CONFIG(debug, debug|release) { DEFINES += DEBUG_MODE }
else:CONFIG(force_debug_info) { DEFINES += PROFILE_MODE }
else { DEFINES += RELEASE_MODE }
Qt對待調試和發佈構建的方式隨着時間的推移在內部發生了變化。所以我們發現之前在調試版和發佈版之間的工作切換會在更高版本中出現看到我的解決方案可以在所有平臺和所有Qt版本上運行到現在。 http://stackoverflow.com/questions/32046181/how-to-detect-qt-creators-target-debug-release-visual-studio/32048654#32048654 – adlag 2015-12-12 11:50:19