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模式下生成:
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.创建子项目目录