shadow build
shadow build 是什么东西?就是将源码路径和构建路径分开(也就是生成的makefile文件和其他产物都不放到源码路径),以此来保证源码路径的清洁。
这不是qmake独创的东西,cmake中早就使用这个东西了
|
cmake
|
qmake
|
备注
|
in-source
|
cmake .
|
qmake project.pro
|
在源码路径下执行
|
out-of-source
(shadow-build)
|
mkdir build
cd build
cmake ../project
|
mkdir build
cd build
qmake ../project/project.pro
|
创建目录,在其他路径下执行(参数指向源码路径)
|
- 注意:
- qmake 的shadow build还是很不完善,与cmake尚不可同日而语
- qmake 的shadow build目录不可以是源码目录的子目录
之前
在shadow-build之前,为了将生成物和源码尽可能的分开,我们一般都会设置很多qmake的变量,比如:
DESTDIR = $$PWD/bin
|
目标文件放置位置
|
DLLDESTDIR = $$[QT_INSTALL_BINS]
|
win下拷贝动态库到qt安装路径
|
MOC_DIR = $$PWD/temp
|
moc的产物放置何处
|
RCC_DIR = $$PWD/temp
|
rcc的产物放置何处
|
UI_DIR = $$PWD/temp
|
uic的产物放置何处
|
OBJECTS_DIR = $$PWD/temp/$$TARGET
|
编译器生成的.o(.obj)等文件放置
|
这样一来,我们将Qt的扩展部分(moc/rcc/uic)以及编译器的中间产物都放置到了一个 temp 子目录中。源码还算比较清洁,可是和out-of-source比较的话,还是不太爽:
- 生成的 makefile 依然在源码路径下
- 如果一套源码要分别用msvc2008、msvc2008、mingw分别编译又不互相干扰呢?
之后
有了 out-of-source 就方便多了:
|-- project-sources/
|-- build-vs2008/
|-- build-vs2005/
|-- build-mingw/
|-- build-symbian/
|-- build-dbzhang800/
|-- ...
创建一个构建目录,然后在该目录下调用合适的qmake,并指向源码下的工程文件即可
qmake ../project-sources/project.pro
有用的变量
前面提到的了,qmake的shadow-build功能尚不完善,一个表现就是提供的可用变量太少了,呵呵(个人观点,有点找拍哈,可能大家都喜欢简单 dbzhang800 20110423)
PWD
|
使用该变量的文件(.pro 或 .pri)所在目录,注意对比下一个
|
_PRO_FILE_PWD_
|
pro文件所在目录(注意:即使它用在pri文件内,也是指代的包含它的pro文件所在的目录)
|
_PRO_FILE_
|
pro文件的全路径
|
OUT_PWD
|
生成的makefile文件所在路径,和_PRO_FILE_PWD_对应
|
当不使用shadow build构建时,OUT_PWD 和_PRO_FILE_PWD_是相同的,据此,我们可以判断采用了何种构建方式,进而采用不同的动作:
!contains(_PRO_FILE_PWD_, $${OUT_PWD}) {
#do something when using shadow build
}
#直接使用equals更好一些,但是manual对此没有任何说明(所以我不清楚你的qmake对此是否支持,至少Qt4.5以后都是支持的)
!equals(_PRO_FILE_PWD_, OUT_PWD) {
#do something when using shadow build
}
比如说,采用out-of-source构建时,我们可能需要将一些文件从源码目录拷贝到构建目录下,用cmake时,这个很容易做到,但在qmake下,似乎缺少通用的方式,一个简单的demo如下:
FILES_COPY_SRC = $$SOURCES /
dbzhang800.txt /
images/abc.png /
i18n/abcd.qm
win32{
COPY = copy /y
MKDIR = mkdir
}else{
COPY = cp
MKDIR = mkdir -p
}
!equals(_PRO_FILE_PWD_, OUT_PWD) {
for(f, FILES_COPY_SRC){
dist_file = $$OUT_PWD/$$f
dist = $$dirname(dist_file)
win32:dist = $$replace(dist, /, //)
!exists($$dist):system($$MKDIR $$dist)
!exists($$dist_file):system($$COPY $$f $$dist)
}
}
还是写一点解释吧,可能对大家有帮助,也防止自己时间长了会忘记。
- windows下,必须先将路径分割符由“/”替换成 “/”
- 目标目录不存在,创建目录。
- 目标文件不存在,拷贝文件。
参考
分享到:
相关推荐
qmake使用手册
再在终端输入:zhuquan@zhuquan-HP-Z230-Tower-Workstation:~$ qmake -v显示结果为:QMake version
Qt5.14.2交叉编译配套qmake.conf文件
qmake的介绍 qmake是Trolltech公司创建的用来为不同的平台和编译器书写Makefile的工具。 手写Makefile是比较困难并且容易出错的,尤其是需要给不同的平台和编译器组合写几个Makefile。使用qmake,开发者创建一个...
QMake指南(高级技巧),PDF格式。
qmake使用指南
QT4学习资源,qmake-manual,英文版
这个是单独的qmake.exe工具,如果不想安装qt的相关的包仅仅想使用QT creator。
qmake 手册 (初级部分) from: cuteqt.org
在这篇文档中,将以C/C++的源码作为我们基础,所以必然涉及一些关于C/C++的编译的知识,相关于这方面的内容,还请各位查看相关的编译器的文档。这里所默认的编译器是UNIX下的GCC和CC。
qmake用户手册,感兴趣的朋友,可以下载看看,不需要资源分
qmake用户手册.pdf qmake用户手册.pdf qmake用户手册.pdf qmake用户手册.pdf
编译需要安装好qt和vs环境,可以直接生成需要的库,动态应用,有需要xmpp通信协议开发的童鞋快来下载吧!
qmake作为QT编译工具,也可以连接第三方库,主要介绍如何使用qmake连接第三方库(如:SDL库)
qt4资源 和一些qmake .....和一些港湾网络的一个教学材料。。。哈哈
qmake 使用技巧, Qt使用中遇到的几个问题解决方法。
自己从QT5.9.1的源代码里面移植的qmake工程,将源代码移植到vs2017项目,支持代码修改,代码调试;修改了qmake在windows下不支持中文路径的问题。
交叉编译QT4.8.7源码生成qmake工具.pdf
linux/unix 使用详解介绍,对初学者和Linux程序员都有用
./浅谈qmake之pro,pri,prf,prl文件.pdf ./QT的信号与槽机制介绍.pdf ./QT中PRO文件写法的详细介绍.pdf ./Qt持久性对象进行序列化.pdf ./Qt新渲染底层Scene Graph研究3.pdf ./Qt模块化笔记之Qt_Quick--用...