天天看點

Qt Creator指定臨時檔案生成目錄(MOC_DIR/RCC_DIR等)和PWD/OUT_PWD/.pro官方文檔

1、指定臨時檔案

Qt Creator預設情況下把所有的編譯中間檔案都生成到debug和release檔案夾裡。可以在.pro檔案中加入:

MOC_DIR = temp/moc

RCC_DIR = temp/rcc

UI_DIR = temp/ui

OBJECTS_DIR = temp/obj

這樣,編譯時生成的臨時檔案就按不同類型分類放到項目下的temp檔案夾中了。

2、指定庫檔案路徑PWD/OUT_PWD/_PRO_FILE_/_PRO_FILE_PWD_

PWD

指的是目前正在解析的.pro檔案的目錄的完整路徑。 在編寫支援影子建構的項目檔案時,PWD很有用。

message($$PWD)

OUT_PWD

指的是qmake生成的Makefile的目錄的完整路徑。即建構目錄,例如build-??-Desktop_Qt_5_12_8_MSVC2017_64bit-Debug

message($$OUT_PWD)

_PRO_FILE_

正在使用的項目檔案的路徑。

message($$_PRO_FILE_)

_PRO_FILE_PWD_

包含目錄的路徑,該目錄包含正在使用的項目檔案。

message($$_PRO_FILE_PWD_)

如何區分這4個變量?

qmake的若幹與路徑相關的變量,如何區分它們?

.pro或.pri所在路徑,注意區分_PRO_FILE_PWD_

pro檔案所在路徑(注意:即使它在pri檔案内,也是指代的包含它的pro所在的路徑)

pro的全路徑

makefile所在路徑,和_PRO_FILE_PWD_對應

#當不使用shadow build建構時,OUT_PWD和_PRO_FILE_PWD_是相同的.

#據此,我們可以判斷采用了何種建構方式,進而采用不同的動作:

!contains(_PRO_FILE_PWD_, $${OUT_PWD}) {

#do something when using shadow build

}

#不建議使用contains,而是直接使用equals更好些,但是manual對此沒有任何說明,

!equals(_PRO_FILE_PWD_, OUT_PWD) {

#列印測試

message("PWD=")
message($$PWD)
message("OUT_PWD=")
message($$OUT_PWD)
message("_PRO_FILE_=")
message($$_PRO_FILE_)
message("_PRO_FILE_PWD_=")
message($$_PRO_FILE_PWD_)      

另外,也可以指定目标檔案的路徑

Debug:DESTDIR = $$PWD/../bin_d

Release:DESTDIR = $$PWD/../bin

LIBS += -L folderPath //引入的lib檔案的路徑 -L:引入路徑

Debug:LIBS+= -L folderPath // Debug 版引入的lib 檔案路徑

Release:LIBS+= -L folderPath // release 版引入的lib檔案路徑

DEPENDPATH:工程的依賴路徑

INCLUDEPATH:指定工程要用到的頭檔案路徑,一般包括使用者自定義的頭檔案路徑或沒有放入系統頭檔案路徑的頭檔案路徑

CONFIG(debug, debug|release):LIBS += -L../lib1 -lhellod

CONFIG(release, debug|release):LIBS += -L../lib2 -lhello

例如:

INCLUDEPATH += "muparser/include" #firecat modify
DEPENDPATH += "muparser/lib"
LIBS += "F:\CADCAM\QCAD\src\LibreCAD-v1.0.4\generated\lib\muparser.lib"
lib舉例
#生成lib
DLL_NAME = muparser
win32:CONFIG(debug, debug|release) {
    TARGET = $${DLL_NAME}d
} else {
    TARGET = $$DLL_NAME
}
#添加lib
win32:CONFIG(debug, debug|release): {
    LIBS += "../bin/lib/muparserd.lib"
}
else:win32:CONFIG(release, debug|release): {
    LIBS += "../bin/lib/muparser.lib"
}
#通用公式
defineReplace(qtLibraryName) {
   unset(LIBRARY_NAME)
   LIBRARY_NAME = $$1
   CONFIG(debug, debug|release) {
      !debug_and_release|build_pass {
          mac:RET = $$member(LIBRARY_NAME, 0)_debug
              else:win32:RET = $$member(LIBRARY_NAME, 0)d
      }
   }
   isEmpty(RET):RET = $$LIBRARY_NAME
   return($$RET)
}
#大寫的L表示路徑;小寫的l表示庫檔案
LIBS += -L$${DESTDIR} #lib path
LIBS *= -l$$qtLibraryName(ribbonTabbar)
關于defineReplace的詳情,請見文章末尾的姊妹篇。
絕對路徑:
QSKIALIB_PATH = ../$$DESTDIR
message($$absolute_path($$QSKIALIB_PATH))      

3、分享我個人的.pro工程檔案

#qt引用子產品核心功能,界面,網絡,序列槽
QT += core gui  network sql serialport widgets
#這是Qt5為了相容Qt4而專門設計的
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
#工程所使用的模版;app表示是應用程式;lib則表明是庫
TEMPLATE=app
#臨時檔案存放位置
MOC_DIR         = temp/moc  #指定moc指令将含Q_OBJECT的頭檔案轉換成标準.h檔案的存放目錄
RCC_DIR         = temp/rcc  #指定rcc指令将.qrc檔案轉換成qrc_*.h檔案的存放目錄
UI_DIR          = temp/ui   #指定rcc指令将.qrc檔案轉換成qrc_*.h檔案的存放目錄
OBJECTS_DIR     = temp/obj  #指定目标檔案(obj)的存放目錄
#指定生成的應用程式放置的目錄
#DESTDIR         = bin
#指定生成的應用程式放置的目錄
IDE_SOURCE_TREE = $$PWD #.pro或.pri檔案所在的位置
IDE_BUILD_TREE  = $$IDE_SOURCE_TREE/../
win32:CONFIG(debug, debug|release){
    contains(DEFINES, WIN64) {
    DESTDIR = $$IDE_BUILD_TREE/_debug64
    } else {
    DESTDIR = $$IDE_BUILD_TREE/_debug86
    }
} else:win32:CONFIG(release, debug|release){
    contains(DEFINES, WIN64) {
    DESTDIR = $$IDE_BUILD_TREE/_release64
    } else {
    DESTDIR = $$IDE_BUILD_TREE/_release86
    }
}
macx:CONFIG(debug, debug|release){
    DESTDIR = $$IDE_BUILD_TREE/_debug64
} else:macx:CONFIG(release, debug|release){
    DESTDIR = $$IDE_BUILD_TREE/_release64
}
#指定生成的應用程式名和圖示
TARGET   = Hello
RC_ICONS = Hello.ico
#定義編譯選項
#QT_DEPRECATED_WARNINGS表示當Qt的某些功能被标記為過時的,那麼編譯器會發出警告
DEFINES += QT_DEPRECATED_WARNINGS
#指定編譯器選項和項目配置
CONFIG  += c++11
CONFIG  += warn_on           #告訴qmake要把編譯器設定為輸出警告資訊的
CONFIG  += precompile_header #可以在項目中使用預編譯頭檔案的支援
#預編譯頭檔案路徑
PRECOMPILED_HEADER = $$PWD/stable.h
#disable C4819 warning
win32:QMAKE_CXXFLAGS_WARN_ON += -wd4819
win32:QMAKE_CXXFLAGS += /FS
#win32:QMAKE_CXXFLAGS += /utf-8
#避免VC編譯器關于fopen等應使用fopen_s的安全警告
win32:DEFINES += _CRT_SECURE_NO_WARNINGS      

4、分享我個人的預編譯頭檔案stable.h

//#ifndef STABLE_H
//#define STABLE_H
// Add C includes here
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <math.h>
#if defined __cplusplus
// Add C++ includes here
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
// Qt includes
#include <QtCore>
#include <QtGui>
#include <QtNetwork>
#if (QT_VERSION > QT_VERSION_CHECK(5, 0, 0))
#include <QtWidgets>
#endif
#ifndef max
#define max(x, y) ((x) < (y) ? (y) : (x))
#define min(x, y) ((x) < (y) ? (x) : (y))
#endif
//解決UTF-8編碼中文亂碼的問題
#ifdef _MSC_VER
#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#pragma warning(disable : 4819)
#endif // _MSC_VER >= 1600
#endif // _MSC_VER
//擴充qDebug以檔案行列記錄資訊
#define QLOG_DEBUG(msg) qDebug() << QString("[%1][%2][%3][%4]%5")                                               \
                                        .arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"))  \
                                        .arg("DEBUG")                                                           \
                                        .arg(QString("%1:%2:%3").arg(__FILE__).arg(__LINE__).arg(__FUNCTION__)) \
                                        .arg(QThread::currentThread()->objectName())                            \
                                        .arg(msg);
#define FIRLOG //FIRLOG::日志開關,注釋關閉列印日志
#ifdef FIRLOG
#define firecat_log qDebug() << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz") \
                             << "[DEBUG]" << __FILE__ << __LINE__ << __FUNCTION__ << "msg:"
#else
#define firecat_log qDebug()
#endif
#endif //__cplusplus
//#endif // STABLE_H      

5.Qt官網關于qmake和.pro檔案詳解

https://doc.qt.io/ https://doc.qt.io/qt-5/cmake-manual.html https://doc.qt.io/qt-5/qmake-manual.html https://doc.qt.io/qt-5/qmake-project-files.html https://doc.qt.io/qt-5/qmake-common-projects.html https://doc.qt.io/qt-5/qmake-language.html https://doc.qt.io/qt-5/qmake-precompiledheaders.html https://doc.qt.io/qt-5/qmake-environment-reference.html https://doc.qt.io/qt-5/qmake-variable-reference.html

官方.pro檔案的變量清單,多關注QMAKE_CXXFLAGS

win32:QMAKE_CXXFLAGS += /FS

https://doc.qt.io/qt-5/qmake-test-function-reference.html

Log4Qt的基本使用Qt進階——QMake使用者指南

6.姊妹篇

歡迎通路姊妹篇《Qt .pro檔案之defineReplace函數的用法,實作lib檔案名自動添加字尾"d"》

歡迎通路姊妹篇《關于Qt Creator項目中.pro檔案中的相對路徑》

---

參考文獻

https://blog.csdn.net/a15005784320/article/details/98480663

————————————————

版權聲明:本文為CSDN部落客「libaineu2004」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:

https://blog.csdn.net/libaineu2004/article/details/89366925

繼續閱讀