• 6804阅读
  • 11回复

[提问]静态编译qt后的一个小问题 [复制链接]

上一主题 下一主题
离线wjz2047
 

只看楼主 倒序阅读 楼主  发表于: 2014-07-04
编译qt的时候看别人的教程写道:“搜索整个文件,将MD,MDd对应改成MT,MTd,以实现在没有VC库的电脑也能运行Qt程序”,那么这样编译出的qt库类型就会是MT,MTd类型的。我想问下,以这样的库开发程序时,还能不能在程序中动态链接(其他程序的)dll?
离线ashe0817

只看该作者 1楼 发表于: 2014-07-04
当然可以啊。
离线wjz2047

只看该作者 2楼 发表于: 2014-07-04
回 ashe0817 的帖子
ashe0817:当然可以啊。[表情]  (2014-07-04 14:58) 

调用的时候是不是也要求其他程序的dll类型也为“MT”?
离线ashe0817

只看该作者 3楼 发表于: 2014-07-04
回 wjz2047 的帖子
wjz2047:调用的时候是不是也要求其他程序的dll类型也为“MT”? (2014-07-04 15:07) 

。。。。这。。。你很萌萌哒。当然不需要啊,DLL是独立的,跟你的程序没有 任何关系。
你想想,你用qt写的程序调用一个delphi写的dll,可是dll哪来什么MT这些编译参数啊
离线wjz2047

只看该作者 4楼 发表于: 2014-07-04
回 ashe0817 的帖子
ashe0817:。。。。这。。。你很萌萌哒。当然不需要啊,DLL是独立的,跟你的程序没有 任何关系。
你想想,你用qt写的程序调用一个delphi写的dll,可是dll哪来什么MT这些编译参数啊[表情] (2014-07-04 15:11) 

讨厌,嘲笑人家。。。是这样的,我创建了一个qt程序A,然后以库的形式调用B,B包含很多项目,这些项目被编译成库供A调用,其中有一个项目是编译成dll的,名为jpeg.dll。然后调用出错了。程序报lnk2005重定义的错误。说什么error LNK2005: jpeg_start_decompress 已经在 QtGui.lib(jdapistd.obj) 中定义    。我就怀疑是不是jpeg.dll的类型不正确,你怎么看?
离线liulin188

只看该作者 5楼 发表于: 2014-07-04
MT和MD的意思楼主可以去百度下

大家默认的标准都是动态用MD,静态用MT

否则MT和MD会造成库连接冲突,需要手动去忽略
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
离线ashe0817

只看该作者 6楼 发表于: 2014-07-04
回 wjz2047 的帖子
wjz2047:讨厌,嘲笑人家。。。是这样的,我创建了一个qt程序A,然后以库的形式调用B,B包含很多项目,这些项目被编译成库供A调用,其中有一个项目是编译成dll的,名为jpeg.dll。然后调用出错了。程序报lnk2005重定义的错误。说什么error LNK2005: jpeg_start_decompress 已经在 QtGui.lib .. (2014-07-04 15:50)

用静态库当然会冲突啦,需要两边保持一致,不仅仅是mt或md要相同,编译器版本也有要求的!

但是你说的是jpeg.dll,你的.lib应该只是一个导入库,跟mt md没关系。除非是静态库才需要保持两边一直。但是静态库怎么会有dll呢!?
离线wjz2047

只看该作者 7楼 发表于: 2014-07-04
回 ashe0817 的帖子
ashe0817:
用静态库当然会冲突啦,需要两边保持一致,不仅仅是mt或md要相同,编译器版本也有要求的!
但是你说的是jpeg.dll,你的.lib应该只是一个导入库,跟mt md没关系。除非是静态库才需要保持两边一直。但是静态库怎么会有dll呢!?


这是项目B中jpeg的属性,会生成一个jpeg.lib和一个jpeg.dll。

我在项目A中的附加依赖项中添加jpeg.lib,从而实现调用。
思路就是这样
离线wjz2047

只看该作者 8楼 发表于: 2014-07-04
回 ashe0817 的帖子
ashe0817:用静态库当然会冲突啦,需要两边保持一致,不仅仅是mt或md要相同,编译器版本也有要求的!
但是你说的是jpeg.dll,你的.lib应该只是一个导入库,跟mt md没关系。除非是静态库才需要保持两边一直。但是静态库怎么会有dll呢!? (2014-07-04 16:33) 

补充一点,本身项目B是生成exe的,所以里面含dll,后来为了让A调用B,才把B变为生成lib的。
离线ashe0817

只看该作者 9楼 发表于: 2014-07-04
jpeg.dll
那么.lib文件就是导入库,只是包含该DLL导出的函数和变量的符号名。所以不会存在什么mt md的问题。
离线wjz2047

只看该作者 10楼 发表于: 2014-07-04
回 ashe0817 的帖子
ashe0817:jpeg.dll
那么.lib文件就是导入库,只是包含该DLL导出的函数和变量的符号名。所以不会存在什么mt md的问题。 (2014-07-04 17:49) 

thanks
离线彩阳

只看该作者 11楼 发表于: 2014-07-05
MD、MT这些只是在Visual Studio中的选项。
上海Qt开发联盟,热忱地欢迎你的加入!
快速回复
限100 字节
 
上一个 下一个