• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

碧海无波,细水长流

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

关于android.mk和QT.pro文件编写的区别与区别

各位看官好,最近因为换工作所以最近开始用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的区别

 

posted on 2020-09-27 22:25  碧海无波,细水长流  阅读(687)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3