Qt 库的生成和使用

Qt中生成带d结尾的dll或者修改exe的名称

在pro文件中设置TARGET字段就行了

CONFIG(debug, debug|release) {
   TARGET = myDlld
}
else {
   TARGET = myDll
}

#或者
CONFIG(debug, debug|release) {
    TARGET = $$join(TARGET,,,d)
}
#或者直接这样,这个$$qtLibraryTarget会在debug下直接加d的
TARGET = $$qtLibraryTarget($$TARGET)

#这三种方式当中的TARGET都可以自定义,例如:
TARGET = TestDll

创建/使用QT生成库

一、 创建动态库项目(MyDll)

Since Qt5 you can use QT_ARCH to detect whether your configuration is 32 or 64. When the target is 32-bit, that returns i386 and in case of a 64-bit target it has the value of x86_64. So it can be used like:
contains(QT_ARCH, i386) {
message(“32-bit”)
} else {
message(“64-bit”)
}

QT -= gui

TEMPLATE = lib
DEFINES += MYDLL_LIBRARY	//pro文件中定义 MYDLL_LIBRARY 宏,用在 MyDll_global.h 文件中定义导出


CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    mydll.cpp

HEADERS += \
    MyDll_global.h \
    mydll.h
    
#//指定目标文件的输出目录
contains(QT_ARCH, i386){
    CONFIG(release, release | debug){
        DESTDIR = $$PWD/bin/x86/release
    } else {
        DESTDIR = $$PWD/bin/x86/debug
    }
}
contains(QT_ARCH, x86_64){
    CONFIG(release, release | debug){
        DESTDIR = $$PWD/bin/x64/release
    } else {
        DESTDIR = $$PWD/bin/x64/debug
    }
}

#//指定中间文件的生成路径
MOC_DIR = $$PWD/temp/$$TARGET/moc
RCC_DIR = $$PWD/temp/$$TARGET/rcc
UI_DIR = $$PWD/temp/$$TARGET/ui
OBJECTS_DIR = $$PWD/temp/$$TARGET/obj

TARGET = $$qtLibraryTarget($$TARGET)	//使用此方式,在debug模式下,生成带'd'后缀的库文件

# Default rules for deployment.
unix {
    target.path = /usr/lib
}
!isEmpty(target.path): INSTALLS += target


// MyDll_global.h 头文件

#ifndef MYDLL_GLOBAL_H
#define MYDLL_GLOBAL_H
#include <QtCore/qglobal.h>

#if defined(MYDLL_LIBRARY)
#  define MYDLL_EXPORT Q_DECL_EXPORT
#else
#  define MYDLL_EXPORT Q_DECL_IMPORT
#endif

#endif // MYDLL_GLOBAL_H

// mydll.h 头文件

#ifndef MYDLL_H
#define MYDLL_H

#include "MyDll_global.h"

class MYDLL_EXPORT MyDll
{
public:
    MyDll();
    int Add(int a, int b);
};

#endif // MYDLL_H

// mydll.cpp 实现文件

#include "mydll.h"

MyDll::MyDll()
{
}

int MyDll::Add(int a, int b)
{
    return a + b;
}

编译即可生成库文件
在debug模式下生成:
debug模式
release模式下生成:
release模式
可以看到,debug模式生成的库文件比release模式生成的多了 'd’后缀,且debug会多生成一些调试信息文件

二、使用动态库

1.新建项目DllTest, 并新建文件夹 ‘3rdparty’,使用子项目的方式来管理全部的三方库,新建文件夹MyDll, 将刚才编译好的mydll按目录结构放入:
三方库的目录结构
2.在3rdparty.pri文件中引入各个三方库文,这里只有一个mydll.pri

include($$PWD/MyDll/mydll.pri)

mydll.pri文件中引入当前库的依赖项:

#1.附加包含目录
INCLUDEPATH += $$PWD/include
DEPENDPATH  += $$PWD/include

#2.附加库目录
#   //x86(win32)架构
contains(QT_ARCH, i386){
    CONFIG (debug, release|debug){
        LIBS += -L$$PWD/win32/lib/Debug
    } else {
        LIBS += -L$$PWD/win32/lib/Release
    }
}

#   //X64架构
contains(QT_ARCH, x86_64){
    CONFIG (debug, release|debug){
        LIBS += -L$$PWD/x64/lib/Debug
    } else {
        LIBS += -L$$PWD/x64/lib/Release
    }
}

#3.附加依赖项,引入的是动态库的导出库 (*.lib)
CONFIG (debug, release|debug){
    LIBS += \
        -lMyDlld
} else {
    LIBS += \
        -lMyDll
}

3.在项目的 ‘pro’ 文件中引入 3rdparty.pri

include ($$PWD/3rdparty/3rdparty.pri)

若是不使用子项目pri的方式来引入三方库,也是可以的,那就是将各个库目录和依赖项都配置到项目的pro文件中去;
只是项目复杂之后,建议使用pri的方式来模块化管理各个三方库,比较方便管理和调整


多提一嘴,linux中使用库

1.linux中静态库(libxxx.a)、动态库(libxxx.so),在linux中,使用三方库,无论是静态库还是动态库,链接的方式都是一样的,比如:

//静态库和动态库的写法一样,不需要写前缀lib和后缀.a或者.so
//libgmock.a	libgmock_main.a		libgtest.a	 libgtest_main.a
INCLUDEPATH += $$PWD/gtest/include
LIBS += -L$$PWD/gtest/lib
LIBS += -lgmock -lgmock_main -lgtest -lgtest_main

如果库目录下存在同名的动态库文件,则优先链接动态库文件,除非显示指定链接静态库文件,比如:

//显示指定链接静态库,需要写前缀lib和后缀.a
LIBS += -L$$PWD/gtest/lib
LIBS += -l:libgmock.a -l:libgmock_main.a -l:libgtest.a -l:libgtest_main.a

Windows中使用库文件

windows中使用库文件,只会包含静态库,如下模式

#Link Win32 libraries.
win32: LIBS += -lDbghelp

# Link OpenCV libraries.
win32:CONFIG(release, debug|release): LIBS += -L$$TOOLKIT_DIR/opencv_3_4_1/x86/vc12/lib -lopencv_core341 -lopencv_highgui341 -lopencv_imgproc341 -lopencv_imgcodecs341 -lopencv_videoio341
else:win32:CONFIG(debug, debug|release): LIBS += -L$$TOOLKIT_DIR/opencv_3_4_1/x86/vc12/lib -lopencv_core341d -lopencv_highgui341d -lopencv_imgproc341d -lopencv_imgcodecs341d -lopencv_videoio341d
# Link boost libraries.
win32:CONFIG(release, debug|release): LIBS += -L$$TOOLKIT_DIR/boost_1_56_0/stage/lib/ -llibboost_serialization-vc120-mt-1_56 -llibboost_log-vc120-mt-1_56
else:win32:CONFIG(debug, debug|release): LIBS += -L$$TOOLKIT_DIR/boost_1_56_0/stage/lib/ -llibboost_serialization-vc120-mt-gd-1_56 -llibboost_log-vc120-mt-gd-1_56

# Link qwt libraries.
win32:CONFIG(release, debug|release): LIBS += -L$$TOOLKIT_DIR/Qwt/lib/ -lqwt
else:win32:CONFIG(debug, debug|release): LIBS += -L$$TOOLKIT_DIR/Qwt/lib/ -lqwtd

顺便一提:

Qt添加自定义pri和创建子项目目录的方式如下:
1.添加 pri文件
请添加图片描述
2.创建子项目目录
请添加图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值