• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Qt笔记-pro文件新增宏、if、else、编译后的shell命令写so或dll时提高开发效率

武飞扬头像
IT1995
帮助1

背景是这样的,目标是要写个dll,so,这种动态链接库,但如果直接写这玩意的话,调试起来很麻烦,需要用其他程序去加载他,特别是在linux上,没界面的那种,开发效率简直慢了不知道多少。就在想,能不能在Qt的pro文件中添加一些脚本,通过配置,就能编译出exe可执行程序或者so,dll这种动态链接库。

答案是可以的,思路如下:

①在pro中定义宏,当有这个宏时pro文件保护不同的.h和.cpp文件,从而指定makefile是生成exe还是dll;

②代码中通过pro中定义的宏,对Q_DECL_EXPORT和Q_DECL_IMPORT进行设置,设置到要导出的类上。

具体示例如下:

  1.  
    DEFINES = APP
  2.  
    #DEFINES = LIB
  3.  
     
  4.  
     
  5.  
    QT = core
  6.  
    QT -= gui
  7.  
     
  8.  
    CONFIG = c 11
  9.  
     
  10.  
    TARGET = XXXLib
  11.  
    CONFIG = console
  12.  
    CONFIG -= app_bundle
  13.  
     
  14.  
    QMAKE_CXXFLAGS = -fpermissive
  15.  
     
  16.  
    contains(DEFINES, APP){
  17.  
     
  18.  
    SOURCES = main.cpp
  19.  
     
  20.  
    TEMPLATE = app
  21.  
    QMAKE_POST_LINK = scp programName root@192.168.1.100:/root/bin
  22.  
    }
  23.  
    else{
  24.  
     
  25.  
    TEMPLATE = lib
  26.  
    DEFINES = LIBXXX_LIBRARY
  27.  
    HEADERS = libXXX_global.h
  28.  
    }
  29.  
     
  30.  
     
  31.  
    SOURCES = ...... \
  32.  
    ...... \
  33.  
    ......
  34.  
     
  35.  
    unix{
  36.  
     
  37.  
    INCLUDEPATH = ...... \
  38.  
    ...... \
  39.  
    ......
  40.  
     
  41.  
    LIBS = -L/XXXX/XXXX/XXXX/XXXX-lxxxx_lib -lxxxx_lib -lxxxx_lib
  42.  
     
  43.  
    }
  44.  
     
  45.  
     
  46.  
    DEFINES = QT_DEPRECATED_WARNINGS
  47.  
     
  48.  
     
  49.  
     
  50.  
    HEADERS = ...... \
  51.  
    ...... \
  52.  
    ...... \
  53.  
    ......
学新通

稍微解释下:

①QMAKE_CXXFLAGS = -fpermissive:老项目,允许很多不安全的用法;

②DEFINES :进行宏定义;

③#:pro文件中“#”代表注释;

④TEMPLATE:指明这个程序是APP还是LIB库;

⑤QMAKE_POST_LINK:当链接结束后执行shell命令;

⑥scp programName root@192.168.1.100:/root/bin  将文件传到192.168.1.100的/root/bin目录下;

其中可以看到,为exe程序时,需要包含main.cpp文件,方便调试。

当为lib库时,需要包含libXXX_global.h,并且增加LIBXXX_LIBRARY这个宏定义。

下面来看下libXXX_global.h

  1.  
    #ifndef LIBXXX_GLOBAL_H
  2.  
    #define LIBXXX_GLOBAL_H
  3.  
     
  4.  
    #include <QtCore/qglobal.h>
  5.  
     
  6.  
    #if defined(LIBXXX_LIBRARY)
  7.  
    #define LIBXXX_EXPORT Q_DECL_EXPORT
  8.  
    #else
  9.  
    #define LIBXXX_EXPORT Q_DECL_IMPORT
  10.  
    #endif
  11.  
     
  12.  
    #endif

Q_DECL_EXPORT这个宏代表需要生成动态库,LIBXXX_EXPORT相当于引用那个宏;

最后来看下关键的类,也就是导出的类,提供给三方用的。

  1.  
    #ifndef XXX_XXX_H
  2.  
    #define XXX_XXX_H
  3.  
     
  4.  
    #if defined(LIBXXX_LIBRARY)
  5.  
    #include "libXXX_global.h"
  6.  
    #else
  7.  
    #define LIBXXX_EXPORT
  8.  
    #define LIBXXX_EXPORT
  9.  
    #endif
  10.  
     
  11.  
    class LIBXXX_EXPORT ClassTest{
  12.  
     
  13.  
    public:
  14.  
    ......
  15.  
    ......
  16.  
     
  17.  
    protected:
  18.  
    ......
  19.  
    ......
  20.  
     
  21.  
    private:
  22.  
    ......
  23.  
    ......
  24.  
    };
  25.  
     
  26.  
     
  27.  
    #endif //XXX_XXX_H
学新通

从中LIBXXX_LIBRARY是在pro文件中定义的,当有时就加载libXXX_global.h,没有就说明是exe,就

#define LIBXXX_EXPORT

#define LIBXXX_EXPORT

定义为空,这样下面的ClassTest就是普通的类了。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhghbjgg
系列文章
更多 icon
同类精品
更多 icon
继续加载