2010-04-05 88 views
91

我有一個Qt項目,我想在源碼樹之外輸出編譯文件。如何在QMake .pro文件中指定不同的Debug/Release輸出目錄

目前,我有以下目錄結構:

/ 
|_/build 
|_/mylib 
    |_/include 
    |_/src 
    |_/resources 

根據不同的配置(調試/釋放),我會喜歡到構建目錄中生成的文件輸出下構建/調試或建立/釋放目錄。

我該如何使用.pro文件做到這一點?

+0

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

回答

134

對於我的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 

它了簡單,但很好! :)

+17

正是我需要的!注意:爲了讓事情更容易切換,只需定義你的'DESTDIR',然後在所有其他路徑中使用該值:'OBJECTS_DIR = $$ {DESTDIR}/.obj'。乾杯! – 2012-03-07 04:16:12

+4

介意解釋這是如何使用/它做了什麼?當我執行它時似乎沒有效果。 *編輯:*如果我更改調試調試(小寫)它的作品。我懷疑這是一個windows vs unix大小寫敏感的東西。 – notlesh 2012-12-31 18:14:04

+7

我投票,因爲它在Windows上工作。在Linux上(Ubuntu 15.04,Qt 5.5.0),我不得不將'Debug'改爲'debug'並將'Release'改爲'release'。 – Jepessen 2015-07-21 12:20:16

42

要改變目標的dll/exe文件的目錄,在你的職業文件中使用此:

CONFIG(debug, debug|release) { 
    DESTDIR = build/debug 
} else { 
    DESTDIR = build/release 
} 

您可能還需要更改像目標文件和建設部文件(檢查qmake variable reference的詳細信息等構建目標目錄或qmake CONFIG() function reference)。

+5

但我發現包括$$ OUT_PWD更好這,所以DESTDIR = $$ OUT_PWD/debug – Ivo 2012-05-16 07:28:08

+1

@Ivo:啊!謝謝!我一直在尋找哪個變量包含該路徑! :d – Cameron 2013-01-28 00:25:45

+1

此之後,您可以添加像行:'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

13

我用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" 
} 
38

我有一個更緊湊的方法:

release: DESTDIR = build/release 
debug: DESTDIR = build/debug 

OBJECTS_DIR = $$DESTDIR/.obj 
MOC_DIR = $$DESTDIR/.moc 
RCC_DIR = $$DESTDIR/.qrc 
UI_DIR = $$DESTDIR/.ui 
+2

您的答案是將編譯器生成輸出放在單獨目錄中的更新方法。 – SIFE 2013-02-13 12:44:38

+1

您是否最近嘗試過調試和發佈?無論使用哪種配置,我的編譯輸出總是出現在發佈文件夾中; qmake/qt造物主行爲可能已經改變,因爲你發佈這個答案,雖然... – ssc 2015-06-18 18:26:47

+0

嘗試添加「配置 - =調試」的額外參數qmake在釋放模式 – 2015-06-23 14:54:13

1

它也是有用的爲輸出可執行稍有不同的名稱。你不能使用類似的東西:

release: Target = ProgramName 
debug: Target = ProgramName_d 

爲什麼它不工作不明確,但它不。但是:

CONFIG(debug, debug|release) { 
    TARGET = ProgramName 
} else { 
    TARGET = ProgramName_d 
} 

只要CONFIG +=行在它之前,這就行。

+0

名稱是相反的方式,但它的工作原理 – 2017-10-20 12:39:05

6

老問題,但仍值得一個最新的答案。今天通常使用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 
+0

作品對於單個項目來說很好,但如果你有一個項目和一個圖書館呢?然後,您需要一個包含庫afaics的依賴於構建類型的方式。 – Adversus 2015-02-15 09:30:41

+0

@Adversus我不確定你的意思,但也許Qmake變量'$(OUT_PWD)'是解決方案? – hyde 2015-02-15 10:31:17

+0

當我將我的問題應用於您的示例時,它變爲:應用程序拾取「mylib」的最簡潔方式是什麼?我喜歡它,如果有一個「優雅」的方式來做到這一點,我沒有看到除了使用其他答案的技術之外的其他方法:使用構建類型和配置來填充智能中的LIBS方式,取消陰影構建的優勢。 – Adversus 2015-02-16 10:56:27

9

做到這一點,正確的方法是以下(感謝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 

更多的信息在這裏:https://wiki.qt.io/Qt_project_org_faq#What_does_the_syntax_CONFIG.28debug.2Cdebug.7Crelease.29_mean_.3F_What_does_the_1st_argument_specify_and_similarly_what_is_the_2nd_.3F

+0

非常好的一點! :) – Tarod 2016-01-14 12:44:03

0

簡短的回答是:你不要

您應該運行,隨後在任何build目錄你想建立的。所以,在debug目錄中release目錄運行一次,一次makeqmake

那怎麼有人構建項目會期望它的工作,這就是Qt的本身如何設置建立,這也是Qt Creator的期望如何你.pro文件的行爲:它只是開始qmake,然後make build文件夾中爲您的目標的選擇配置。

如果您希望創建這些文件夾並在其中執行兩個(或更多)構建,則需要一個頂級makefile,可能通過qmake從頂級項目文件創建。

擁有兩個以上的構建配置並不罕見,因此您不必要承諾區分構建和發佈;你可能會建立不同的優化級別,等等。調試/釋放二分法是最好的安息。

0

Qt Creator的新版本在調試和發佈之間還有一個「配置文件」構建選項。以下是我如何檢測到:

CONFIG(debug, debug|release) { DEFINES += DEBUG_MODE } 
else:CONFIG(force_debug_info) { DEFINES += PROFILE_MODE } 
else {       DEFINES += RELEASE_MODE } 
相關問題