• 关于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的区别

  • 相关阅读:
    js单体模式
    react实现递归搜索下拉查询目录树功能
    浏览器跨域问题分析
    css中清除浮动
    ts中的函数
    ts中类型
    RX.js6变化
    js对象模型3
    React数组变化之后,视图没有更新
    Mac安装yarn并配置环境变量PATH,运行报错问题解决
  • 原文地址:https://www.cnblogs.com/songyuchen/p/13741983.html
Copyright © 2020-2023  润新知