用QT创建不依赖系统动态库的dll

十八道胡同 2018-12-24 02:05:20
我看到QT可以创建non-Qt 项目,继续选择可以是C++项目,创建好之后默认是console的app项目,请问怎么修改成结果文件是dll的动态库项目?


网上找了很久,没找到好的办法,谢谢各位。
...全文
608 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
十八道胡同 2018-12-25
  • 打赏
  • 举报
回复
引用 11 楼 失散糖 的回复:
/MD里描述的“多线程调试 DLL (/MDd)”,并不代表你的目标是dll,而是指希望输出的exe和dll文件依赖vcredist里的dll文件。你注意下/MT的描述,是“多线程 (/MT)”,不是“多线程exe (/MT)”之类的吧。/MT指希望输出的exe和dll文件不去依赖vcredist里的dll文件。


明白了,我试下,非常感谢。

特意给帖子加分,非常感谢你的帮助。
失散糖 2018-12-25
  • 打赏
  • 举报
回复
/MD里描述的“多线程调试 DLL (/MDd)”,并不代表你的目标是dll,而是指希望输出的exe和dll文件依赖vcredist里的dll文件。你注意下/MT的描述,是“多线程 (/MT)”,不是“多线程exe (/MT)”之类的吧。/MT指希望输出的exe和dll文件不去依赖vcredist里的dll文件。
十八道胡同 2018-12-25
  • 打赏
  • 举报
回复
visual studio运行时库MT、MTd、MD、MDd的研究


在开发window程序是经常会遇到编译好好的程序拿到另一台机器上面无法运行的情况,这一般是由于另一台机器上面没有安装相应的运行时库导致的,那么这个与编译选项MT、MTd、MD、MDd有什么关系呢?这是msdn上面的解释:

MT:mutithread,多线程库,编译器会从运行时库里面选择多线程静态连接库来解释程序中的代码,即连接LIBCMT.lib库

MTd:mutithread+debug,多线程调试版,连接LIBMITD.lib库

MD:MT+DLL,多线程动态库,连接MSVCRT.lib库,这是个导入库,对应动态库为MSVCRT.dll

MDd: MT+DLL+debug,多线程动态调试库,连接MSVCRTD.lib库,对应动态库为MSVCRTD.dll

开发多线程程序时(单线程本文不做讨论),需要选择MT、MTd、MD、MDd其中的一个。



对于MT/MTd,由于连接运行时库是LIBCMT.lib/LIBCMTD.lib,这两个库是静态库,所以此种方式编译的程序,移到另一台机器上面也可以正常运行。

但是对于MD/MDd,连接的是动态库,所以如果另一台机器上没有MSVCRT.dll/MSVCRTD.dll时,就提示缺少动态库这样的错误。



曾经犯这样的错误,以为以MT/MTd方式编译,程序对所有的库都是静态链接的,其实错了,它只能决定运行时库是动态链接还是静态链接,对用户自己写的库或其他第三方库,其连接方式取决于代码(显式连接动态库Loadlibrary)或所提供的lib文件(为导入库还是静态库),移动程序到别的机器上时,还是要带上所需要的动态库的。


是这么解释的吧?
引用 7 楼 失散糖 的回复:
你要这样的话,那与qt一点关系都没有。

项目属性:配置改为release,配置属性->C/C++->代码生成->运行库,改为/MT,rebuild就可以了。
十八道胡同 2018-12-25
  • 打赏
  • 举报
回复
引用 7 楼 失散糖 的回复:
你要这样的话,那与qt一点关系都没有。

项目属性:配置改为release,配置属性->C/C++->代码生成->运行库,改为/MT,rebuild就可以了。


你是说VS里面这个设置? 我的程序是要生成动态链接库, 不是要多线程 DLL (/MD) 吗?
十八道胡同 2018-12-25
  • 打赏
  • 举报
回复
有一个dll,不需要安装单独的组件,可以直接跑,我用depends看,他是依赖于这些dll
ADVAPI32.DLL
KERNEL32.DLL
MSVCRT.DLL
OLE32.DLL
SHELL32.DLL
USER32.DLL
VERSION.DLL
WINMM.DLL
WS2_32.DLL

,我的程序是C++写的,难道他这个是C原因写的?
失散糖 2018-12-25
  • 打赏
  • 举报
回复
你要这样的话,那与qt一点关系都没有。 项目属性:配置改为release,配置属性->C/C++->代码生成->运行库,改为/MT,rebuild就可以了。
十八道胡同 2018-12-25
  • 打赏
  • 举报
回复
引用 3 楼 彩阳 的回复:
你可以选择使用MinGW构建套件呀。


你是说在QT里面选择使用MinGW来编译对吧?

QT的pro文件是这个写的,用的MinGW qmake来编译的


TEMPLATE = lib
CONFIG += c++11
CONFIG -= app_bundle
CONFIG -= qt
CONFIG += thread

SOURCES += \
main.cpp \

HEADERS += \


SOURCES 和HEADERS 这里有省略,但是生成出的dll不能使用。。

用depends查看,少了LIBGCC_S_SEH-1.DLL LIBWINPTHREAD-1.DLL LIBSTDC++-6.DLL 这3个dll

这个用到多线程
十八道胡同 2018-12-25
  • 打赏
  • 举报
回复
引用 4 楼 失散糖 的回复:
2#的链接貌似是叫vcredist,不算系统动态库。qt网站上提供的qt库,是“动态qt+动态vcredist”,你需要的是静态vcredist,可以是“动态qt+静态vcredist”,可以是“静态qt+静态vcredist”。如果要用vs2013开发,可以自己下载qt原码,自己编译qt库。
编译qt库的方法网上随便找,想要实现静态vcredist,对于qt版本5.6及以上的情况,需要在configure的时候传递参数-static-runtime;对于版本小于5.6的情况,需要在源码里qtbase\mkspecs\common\msvc-desktop.conf文件中搜索-MD,统统改成-MT。
自己编译的qt库,跟qt vs tools的兼容性不好,因此需要在平时调试时用现成的qt库,只在发布的时候,改成用命令行,qmake加上nmake的方式比较好。


谢谢很详细的回复。
现在是用vs2013开发好了dll,但是机器需要安装vcredist。我的想法是 是否可以用QT来开发这个dll,从而达到不需要安装vcredist的目的,谢谢。

如果可以,要咋个操作呢?昨天在网上找了半天没找到好办法。 关于non-Qt project的资料几乎没有。。
失散糖 2018-12-25
  • 打赏
  • 举报
回复
2#的链接貌似是叫vcredist,不算系统动态库。qt网站上提供的qt库,是“动态qt+动态vcredist”,你需要的是静态vcredist,可以是“动态qt+静态vcredist”,可以是“静态qt+静态vcredist”。如果要用vs2013开发,可以自己下载qt原码,自己编译qt库。 编译qt库的方法网上随便找,想要实现静态vcredist,对于qt版本5.6及以上的情况,需要在configure的时候传递参数-static-runtime;对于版本小于5.6的情况,需要在源码里qtbase\mkspecs\common\msvc-desktop.conf文件中搜索-MD,统统改成-MT。 自己编译的qt库,跟qt vs tools的兼容性不好,因此需要在平时调试时用现成的qt库,只在发布的时候,改成用命令行,qmake加上nmake的方式比较好。
彩阳 2018-12-24
  • 打赏
  • 举报
回复
你可以选择使用MinGW构建套件呀。
十八道胡同 2018-12-24
  • 打赏
  • 举报
回复
引用 1 楼 失散糖 的回复:
修改pro文件

TEMPLATE = lib

不依赖系统动态库?什么情况?


用vs2013开发的C++程序,需要安装https://www.microsoft.com/en-us/download/details.aspx?id=40784,目的是不想安装这个组件来完成项目的生成
失散糖 2018-12-24
  • 打赏
  • 举报
回复
修改pro文件 TEMPLATE = lib 不依赖系统动态库?什么情况?

16,233

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧