各位看官好,最近因为换工作所以最近开始用QT来进行编译代码,所以目前所用的代码编写都是QT.pro,而我之前所用的都是Android平台,所以编译的方法都是Android.mk,因此我想通过这篇文章总结一下两者之间的异同。
一、编译的一般框架编写
一、Android.mk的框架编写
二、QT.pro的框架编写
三、两者之间的区别
一、编译的一般框架编写
首先我们抛开书本,想一下,如果我们做一个编译器,我们应该怎么做呢?我想我们至少应该做到以下几件事:
1、首先编译结果当中应该指定我们编写出什么类型(比如app,LIB等等)。
2、既然是编译,我们至少需要把相关的文件写出来,这当中包括CPP文件,.h文件,配置文件,静态库,动态库等等。
3、至少要加一些编译选项,比如说指定c++11编译器,设定开关什么的。
好的,有了这个框架,我们就可以开始解析Android.mk和QT.pro的写法了。
二、Android.mk的框架编写
话不多说,直接上例子
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) ifeq ($(AUDIO_POLICY_TEST),true) ENABLE_AUDIO_DUMP := true endif LOCAL_SRC_FILES:= AudioHardwareGeneric.cpp AudioHardwareStub.cpp AudioHardwareInterface.cpp ifeq ($(ENABLE_AUDIO_DUMP),true) LOCAL_SRC_FILES += AudioDumpInterface.cpp LOCAL_CFLAGS += -DENABLE_AUDIO_DUMP endif LOCAL_SHARED_LIBRARIES := libcutils libutils libbinder libmedia libhardware_legacy ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true) LOCAL_CFLAGS += -DGENERIC_AUDIO endif LOCAL_MODULE:= libaudiointerface ifeq ($(BOARD_HAVE_BLUETOOTH),true) LOCAL_SRC_FILES += A2dpAudioInterface.cpp LOCAL_SHARED_LIBRARIES += liba2dp LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP
LOCAL_C_INCLUDES := sources/foo
endif
include $(BUILD_STATIC_LIBRARY) 模块一编译成静态库
图中红色的四句话是编译的基本条件,Android.mk中编译的基本语法。LOCAL_SRC_FILES表示源文件,LOCAL_SHARED_LIBRARYS:表示动态库,LOCAL_C_INCLUDES:表示.h文件,LOCAL_MODULE表示编写出来的文件名。最后 #include $(BULID_SHARED_LIBRARYS)表示编译出来的是静态库。
当然了,这里只讨论Android.mk和QT.pro的异同,所以具体的语法规则请各位看官参考其他的博客。
三、QT.pro文件的编写
话不多说,也直接上例子。
#-------------------------------------------------
#
# Project created by QtCreator 2020-01-06T16:42:45
#
#-------------------------------------------------
QT += core gui
QT += network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = Detector
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
CONFIG += c++14
QMAKE_CFLAGS += -Wnoerror = -Wdate-time
QMAKE_CXXFLAGS += -Werror -Wno-unused-parameter -Wno-unused-variable -Wno-reorder
-Wno-unknown-pragmas -Wno-deprecated-declarations -Wno-deprecated
contains(CONFIG, X64) {
QMAKE_CXXFLAGS += -Wno-expansion-to-defined -Wno-deprecated-copy
} else {
QMAKE_CXXFLAGS += -fno-strict-aliasing
}
SOURCES +=
SampleApp/CommonData/DataInvertory.cpp
SampleApp/CommonData/DataSystemManager.cpp
SampleApp/GeneralPage/PageWork.cpp
SampleApp/main.cpp
HEADERS +=
SampleApp/CommonData/DataInvertory.h
SampleApp/GeneralPage/PageWork.h
SampleApp/keyboard/widgetKeyBoard.h
FORMS +=
SampleApp/CommonWidget/BoxWidget.ui
SampleApp/CommonWidget/ChangeDoorNameWidget.ui
SampleApp/keyboard/inputdialog.ui
INCLUDEPATH += $$PWD/SampleApp
INCLUDEPATH += $$PWD/SampleApp/GeneralPage
INCLUDEPATH += $$PWD/ThirdParty/IntellBoxSDK/include
DEPENDPATH += $$PWD/ThirdParty/IntellBoxSDK/include
unix:!macx: LIBS += -L$$PWD/ThirdParty/IntellBoxSDK/lib/ -lIntellBoxIntegration
unix:!macx: LIBS += -L$$PWD/ThirdParty/IntellBoxSDK/lib/ -lIntellBoxCommon
unix:!macx: LIBS += -L$$PWD/ThirdParty/IntellBoxSDK/lib/ -ljpeg
unix:!macx: LIBS += -L$$PWD/ThirdParty/IntellBoxSDK/lib/ -lasound
unix:!macx: LIBS += -L$$PWD/ThirdParty/IntellBoxSDK/lib/ -lev
unix:!macx: LIBS += -L$$PWD/ThirdParty/IntellBoxSDK/lib/ -lsqlite3
unix:!macx: LIBS += -L$$PWD/ThirdParty/IntellBoxSDK/lib/ -luuid
unix:!macx: LIBS += -L$$PWD/ThirdParty/IntellBoxSDK/lib/ -lodb
unix:!macx: LIBS += -L$$PWD/ThirdParty/IntellBoxSDK/lib/ -lodb-sqlite
unix:!macx: LIBS += -L$$PWD/ThirdParty/IntellBoxSDK/lib/ -lpaho-mqtt3c
unix:!macx: LIBS += -L$$PWD/ThirdParty/IntellBoxSDK/lib/ -lcurl
RESOURCES +=
res.qrc
DISTFILES +=
SampleApp/Qtstyle.qss
DEFINES +=
DOOR_MANAGER
GOODS_MANAGER
LOGS_MANAGER
SERVICEMESSAGE_MANAGER
USER_MANAGER
RFIDREADER_MANAGER
RFIDDETAIL
TEST
MQTTC
contains(CONFIG, X64) {
DEFINES += X64
} else {
DEFINES += ARM
}
与Android.mk中类似,图中红色标注的部分也是QT.pro中的核心部分,TARGET=Detector表示生成的目标名称,SRC,HEADER以及FORM表示引用的目标文件,TEMPLATE表示生成的种类为可执行文件。
四、QT.pro和Android.mk的区别
1、QT.pro文件很多是自己生成的,而Android.mk基本是自己手写的。所以相对来说QT.pro文件容易一些。
2、关于生成多个库的问题,Android.mk是只要按照顺序就可以正常编写的,但是QT.pro需要把template改成subdir,template也要配置成ordered才可以。
3、Android当中分成eng和user和test三种版式,而QT则分成debug和release两种情况,所以这个还是有一定区别的。
4、两者路径的区别:Android第一句#include ($call my-dir)表示此时保持相对路径,这里面INCLUDE是可以用绝对路径来引用的,但是SRC好像不行(原因我也不知道,不过事实就是这样),所以一般情况是要放在该文件夹里面,而相比于QT则随意的多,可以随意使用绝对或者相对路径
5、关于开关的设置。安卓当中开关只有一个,就是LOCAL_CFLAGS,无论是在代码中加开关,还是说添加c++11编译器,都是采用这个开关进行设计。而QT则麻烦的多,比如添加c++11编译器,那么用CONFIG+=c++11,如果添加开关,使用DEFINES,而QT本身也有开关,比如QMAKE_CFLAGS,这个可以做很多,比如将一些错误变成警告等等。
这大概就是我总结的QT.pro和Android.mk的区别