qmake文档真的不是很全,好多变量都不知道到哪里去找他们的用法,只能暂时copy源码中的部分来用,以后再慢慢学习。这里总结一下查找到资料的qmake知识。php
更多请参考:http://www.qtcentre.org/wiki/index.php?title=Undocumented_qmakelinux
defineReplace(cleanPath) { win32:1 ~= s|\\\\|/|g #用/替换掉\,正则表达式当中用四个反斜杠匹配反斜杠, 这里是Perl的正则表达式的用法,|g表示替换所有符合的模式 contains(1, ^/.*):pfx = / #前缀是/的,在最后要加上/ else:pfx = segs = $$split(1, /)#根据/分开参数1 out = #去除segs中..和. for(seg, segs) { equals(seg, ..):out = $$member(out, 0, -2) #文档中member函数是只有两个参数的,因此这个-2不清楚是作什么的 else:!equals(seg, .):out += $$seg } return($$join(out, /, $$pfx)) ##用/将列表连接起来,并用pfx做为结果的前缀 }
不少状况下咱们须要根据当前build的mode来决定生成的文件名,好比,若是使用debug模式,就在生成文件后面加d。那么当载入这些文件的时候,咱们还须要手动添加这样的话:
debug{
MYFILE = $${NAME}_d.dll
}
release{
MYFILE = $${NAME}.dll
}
每次用到都要写这个,那就来一个函数好了。在QtCreator中的实现是这样的:
正则表达式
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) }
isEmpty(PRECOMPILED_HEADER):PRECOMPILED_HEADER = $$PWD/shared/***.h