目录
qmake是trolltech公司开发的跨平台Makefile生成工具,它被QT用来管理项目工程,无论你的项目是否使用QT编写都可以使用qmake来管理你的项目,因为这样你就不用去写复杂的makefile,虽然已经有cmake了但是qmake会比cmake更简单。
虽然qmake不像cmake多元化,但是qmake至少能够让你快速将一个平台的项目工程迁移到另外一个平台。
如你有一个项目使用visual studio开发的,想要迁移到Linux环境下,要知道linux环境除了QT以外的可视化开发IDE以外几乎没有较好的开发环境,一般都是在终端下进行命令开发编写makefile,在面对数以计万的源代码文件中,我们如何梳理这些文件?难不成写makefile一个一个包含进来?太low了,使用qmake一个命令帮你搞定。
参数:project
用途:根据项目工程生成对应的pro文件
示列:
qmake -project 你的项目文件夹根路径
生成之后会在当前执行这条命令的目录下生成跟目录相同的pro文件
参数:无
示列:
qmake
只要当前目录下有.pro文件,只需要使用qmake就可以了,qmake会自动解析pro文件生成对应的Makefile
你也可以指定pro文件
qmake xxx.pro
然后你就可以make一下了。
如果没有任何意外就会正常编译生成你想要的构建文件。
基本上我们自动化生成pro文件之后都需要进行一次配置,基本配置就是告诉qmake你的程序是lib还是app,以及头文件位置,库的依赖,简单配置一下就可以了,包括支持debug和32bit的选项。
Linux下的qmake默认是不生成32bit和debug版本的Makefile。
可执行程序:
TEMPLATE = app
lib:
TEMPLATE = lib
TARGET = xxxx
这个属性决定了生成文件后的名字
CONFIG += debug_and_release \
32bit
这个属性是告诉qmake debug和release都支持,否则qmake默认只release,同时也要能够支持32bit的程序
当使用了这个属性的时候我们就可以设置debug和release生成文件的输出路径
#Debug and Release 32/64
CONFIG(debug, debug|release){
contains(DEFINES, 32bit) {
DESTDIR = xxx
}else {
DESTDIR = xxx
}
}else{
contains(DEFINES, 32bit) {
DESTDIR = xxx
}else {
DESTDIR = xxx
}
}
上面这段代码很简单CONFIG检查debug,如果不是debug则else是release
在块语句里的contains是用来检查当前是32bit还是64bit
DESTDIR是指定输出目录
OBJECTS_DIR = xxx
pro文件里和shell定义变量一样
#Different attributes
DEBUG_DIR_32 = $${THIS_DIR}/../../linux_output/debug/x32
DEBUG_DIR_64 = $${THIS_DIR}/../../linux_output/debug/x64
RELEASE_DIR_32 = $${THIS_DIR}/../../linux_output/release/x32
RELEASE_DIR_64 = $${THIS_DIR}/../../linux_output/release/x64
引用也很简单:
$${xxxx}
注意前面是两个$$
VERSION=1.0.0
$$(PWD)
注意是$$()括号里写命令即可
INCLUDEPATH += xxx
#Lib Path
LIBS += xxx
库文件和头文件一定要用 += 不要去用=,因为可能有一些依赖库路径与头文件在里面。
HEADERS += xxx.h
SOURCES += xxx.c
c或者cpp都可以。
当你完成你想要的配置之后别忘记qmake让其生效,然后make
最后在给大家献上我自己写的pro文件,大家可以用来参考
######################################################################
# Author: Stephen_Zhou
# Time: 2021-4-7 11:14
# Rely: qmake (3.1)
######################################################################
#Config
#Generate
TEMPLATE = lib
TARGET = QEthRadar
#Architecture
CONFIG += debug_and_release \
32bit
#Version
VERSION=1.0.0
#Path
#Project
THIS_DIR=$$(PWD)
SRC_DIR=$${THIS_DIR}/../../all_src/QEthRadar
SRC_PATH = $${THIS_DIR}/../../all_src
WEYE_HOME_DIR = $${THIS_DIR}/../../
TEMP_DIR = $${WEYE_HOME_DIR}/linux_tmp
#Different attributes
DEBUG_DIR_32 = $${THIS_DIR}/../../linux_output/debug/x32
DEBUG_DIR_64 = $${THIS_DIR}/../../linux_output/debug/x64
RELEASE_DIR_32 = $${THIS_DIR}/../../linux_output/release/x32
RELEASE_DIR_64 = $${THIS_DIR}/../../linux_output/release/x64
#Depend on the file
WEYE_COMM_DIR = $${SRC_PATH}/weye_comm
RELY_DIR = $${THIS_DIR}/../rely
UP_DIR = $${THIS_DIR}/../
WEUTILS_INCLUDE_DIR = $${SRC_PATH}/WeUtils/include
#Libary
PCAP_LIB = $${RELY_DIR}/lib/pcap/lib*
#Temp
OBJECTS_DIR = $${TEMP_DIR}
#Debug and Release 32/64
CONFIG(debug, debug|release){
contains(DEFINES, 32bit) {
DESTDIR = $${DEBUG_DIR_32}
}else {
DESTDIR = $${DEBUG_DIR_64}
}
}else{
contains(DEFINES, 32bit) {
DESTDIR = $${RELEASE_DIR_32}
}else {
DESTDIR = $${RELEASE_DIR_64}
}
}
# Input
HEADERS += $${SRC_DIR}/ETHERNET_PROTOCOL_LIST.h \
$${SRC_DIR}/EthRadar_Utils.h \
$${SRC_DIR}/IP_PROTOCOL_LIST.h \
$${SRC_DIR}/pcap.h \
$${SRC_DIR}/ping.h \
$${SRC_DIR}/RadarDetect.h \
$${SRC_DIR}/RadarRecv.h \
$${SRC_DIR}/RecThread.h \
$${SRC_DIR}/RecvFrames.h \
$${SRC_DIR}/wpcap_helpers.h \
$${SRC_DIR}/include/QEthRadar/EthRadar_APi.h
SOURCES += $${SRC_DIR}/RadarDetect.cpp \
$${SRC_DIR}/RadarRecv.cpp \
$${SRC_DIR}/RecThread.cpp \
$${SRC_DIR}/RecvFrames.cpp \
$${SRC_DIR}/wpcap_helpers.cpp
#Include Path
INCLUDEPATH += $${SRC_DIR}/include \
$${WEYE_COMM_DIR} \
$${UP_DIR} \
$${THIS_DIR} \
$${WEUTILS_INCLUDE_DIR}
#Lib Path
LIBS += $${PCAP_LIB}