• 13080阅读
  • 13回复

vc++2005中的qt的项目静态编译后无法脱离环境 [复制链接]

上一主题 下一主题
离线sbtree
 
只看楼主 倒序阅读 楼主  发表于: 2008-09-22
— 本帖被 XChinux 执行加亮操作(2008-09-23) —
在vc++2005中使用qt静态库创建的qt应用项目,并使用静态编译开关,生成的可执行文件依然无法运行在没有vc++2005运行库文件的机器上。有遇到类似问题的吗?如何解决的?
windows 7 + VC++2008 + Qt4.5.2
离线yfx2003

只看该作者 1楼 发表于: 2008-09-22
1 的确是静态库?

2 .net framework环境是否缺少?

3 依赖库齐全?
www.qtcn.org/gpq4/
ajaxref.okajax.com/
离线sbtree
只看该作者 2楼 发表于: 2008-09-23
引用第1楼yfx2003于2008-09-22 23:42发表的  :
1 的确是静态库?
2 .net framework环境是否缺少?
3 依赖库齐全?


1. 开源qt配置-debug-and-release -static 之后是漫长的编译过程
2. 项目只使用windows标准库,不使用ATL,MFC,也不使用托管代码,应该跟.net无关吧
3. windows application项目静态编译的(/Mt)可执行程序不需要任何依赖库,而qt application项目静态编译的就需要,不知道是不是qt本身依赖了某些动态库,尽管自身被配置生成成静态库。
windows 7 + VC++2008 + Qt4.5.2
离线破烂石头
只看该作者 3楼 发表于: 2008-09-24
我感觉好像只要是用vs的编译器编译的win32工程,都会依赖.net
我用vs2005编译的QT程序必须安装了.net2.0才能运行。08express则需要.net3.5。不知道是不是这个原因
离线sbtree
只看该作者 4楼 发表于: 2008-09-24
引用第3楼破烂石头于2008-09-24 15:17发表的  :
我感觉好像只要是用vs的编译器编译的win32工程,都会依赖.net
我用vs2005编译的QT程序必须安装了.net2.0才能运行。08express则需要.net3.5。不知道是不是这个原因

不是的,win32工程只要是用静态编译开关(/MT or /MTd)是不需要.net环境的。
windows 7 + VC++2008 + Qt4.5.2
离线傻猫
只看该作者 5楼 发表于: 2008-09-24
用DEPENDS.EXE 查看库依赖
-------------------------------
不常在
有事短消息或者到我blog讨论http://hi.baidu.com/ning_cat
已经没用qt作开发了。。。:-(
离线sbtree
只看该作者 6楼 发表于: 2008-09-24
引用第5楼傻猫于2008-09-24 23:27发表的  :
用DEPENDS.EXE 查看库依赖

意义不大,因为使用静态链接开关编译,相关的库都会被连接到应用程序自身,用depends看到的都是windows自身的库文件。

另外一个问题,qt工程生成的项目,一定要带上msvcr80.dll或者相关的vc++运行库文件发布,而且还要带上相应的清单文件.manifest,而不象win32 application那样静态编译后可以完全脱开发环境,也不用安装再发布包,这一点不知道qt是不是给忽略了。
注:工程中使用的是qt静态编译的的库文件
windows 7 + VC++2008 + Qt4.5.2
离线傻猫
只看该作者 7楼 发表于: 2008-09-25
静态编译,清单文件可以选择嵌入的,我在公司服务器上做测试 就是用DEPENDS.EXE来查看库依赖的
那边是2000的系统+无。net库支持的,用vs2005静态编译后的com dll是可以运行的。
-------------------------------
不常在
有事短消息或者到我blog讨论http://hi.baidu.com/ning_cat
已经没用qt作开发了。。。:-(
离线傻猫
只看该作者 8楼 发表于: 2008-09-25
qt的链接库是可能有依赖VC的CRT的,还是要用DEPENDS来查的qt链接库的依赖

可以到我blog--http://hi.baidu.com/ning_cat上讨论下,现在没怎么用QT做开发了,这个论坛偶尔才上了,睡觉去了
[ 此贴被傻猫在2008-09-25 00:14重新编辑 ]
-------------------------------
不常在
有事短消息或者到我blog讨论http://hi.baidu.com/ning_cat
已经没用qt作开发了。。。:-(
离线sbtree
只看该作者 9楼 发表于: 2008-09-25
引用第7楼傻猫于2008-09-25 00:00发表的  :
静态编译,清单文件可以选择嵌入的,我在公司服务器上做测试 就是用DEPENDS.EXE来查看库依赖的
那边是2000的系统+无。net库支持的,用vs2005静态编译后的com dll是可以运行的。

这又引来另一个问题,按道理如果选择不嵌入清单文件,而是把manifesttool生成的清单文件跟可执行文件以及依赖的库文件一同发布就可以了(私有并行程序集),而对于qt工程,这样不行,必须嵌入清单文件,这一点不知道有人注意到没有? 还有个问题,vc++2005自动生成的清单文件有时候有两个版本依赖,有时候只有一个,想知道他的生成原则是什么,在msdn上只看到说,他会搜索所有工程相关的依赖信息,并生成中间的清单文件,最后生成最终的清单文件,没看到更详细的解释。
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 10楼 发表于: 2008-09-25
引用第7楼傻猫于2008-09-25 00:00发表的  :
静态编译,清单文件可以选择嵌入的,我在公司服务器上做测试 就是用DEPENDS.EXE来查看库依赖的
那边是2000的系统+无。net库支持的,用vs2005静态编译后的com dll是可以运行的。

qt支持COM dll吗?我是说,在vc++2005里面可以建立qt com工程吗?我只看到一个ActiveQt server的工程模板看上去有点像,没用过
windows 7 + VC++2008 + Qt4.5.2
离线傻猫
只看该作者 11楼 发表于: 2008-09-25
回 sbtree

QT我没开发过com的,理论上Com的控件可以用纯c++实现,那么qt也是可以实现的

你那个问题 建议你用depend查看你的exe以及你一并发布的qt的dll的库的依赖。
mainfest建议选择嵌入,生成而不嵌入,发行有的时候还是有问题的。建议直接要么不生成清单文件好了

我觉得如果你的exe是使用/MT连接的话,很可能的问题应该出在你携带的dll库上,譬如插件的dll可能要依赖你编译的CRT
-------------------------------
不常在
有事短消息或者到我blog讨论http://hi.baidu.com/ning_cat
已经没用qt作开发了。。。:-(
离线jssx
只看该作者 12楼 发表于: 2008-09-25
就用depend工具。
离线sbtree
只看该作者 13楼 发表于: 2008-09-25
新建了一个最简单的qt应用程序工程qttest,没有额外添加任何代码,使用qt静态库,设置静态连接开关,release
编译参数如下
/O2 /GL /I ".\GeneratedFiles" /I "C:\Qt\4.3.3static\include" /I ".\GeneratedFiles\Release" /I "C:\Qt\4.3.3static\include\QtCore" /I "C:\Qt\4.3.3static\include\QtGui" /D "UNICODE" /D "WIN32" /D "QT_THREAD_SUPPORT" /D "QT_NO_DEBUG" /D "NDEBUG" /D "QT_CORE_LIB" /D "QT_GUI_LIB" /FD /EHsc /MT /Zc:wchar_t- /Fo"Release\\" /Fd"Release\vc80.pdb" /nologo /c /Wp64 /Zi /TP /errorReport:prompt
链接参数如下
/OUT:"D:\qttest\Release\qttest.exe" /NOLOGO /LIBPATH:"C:\Qt\4.3.3static\lib" /MANIFEST /MANIFESTFILE:"Release\qttest.exe.intermediate.manifest" /SUBSYSTEM:WINDOWS /ERRORREPORT:PROMPT msvcrt.lib libcmt.lib qtmain.lib QtCore.lib QtGui.lib imm32.lib winmm.lib ws2_32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
用depends查看依赖库,如图所视,除了windows自身的库文件,还有一个msvcr80.dll,虽然已经使用了静态连接开关,但是这个文件在发布时一定要随可执行文件一起(私有并行程序集)。还有尽管使用了嵌入清单文件,而Microsoft.VC80.CRT.manifest也是不可缺少的,所以在发布时至少要有三个文件(qttest.exe, msvcr80.dll和Microsoft.VC80.CRT.manifest),其他qt库因为使用静态连接,不再需要。我现在怀疑的是,qt的静态库依然要依赖msvcr80.dll(当时静态编译qt库的时候使用的是win32-msvc2005),这一点qmake在使用静态编译选项的时候没有把静态库做的彻底。如果你有不同观点,欢迎一起讨论。
windows 7 + VC++2008 + Qt4.5.2
快速回复
限100 字节
 
上一个 下一个