• 15091阅读
  • 21回复

QT4.7.0静态编译如此之难! [复制链接]

上一主题 下一主题
离线zhuhehz
 

只看楼主 倒序阅读 楼主  发表于: 2010-11-13
按照网上大牛的文章http://blog.csdn.net/tonylk/archive/2009/02/06/3866926.aspx静态编译QT,在历时8小时耗
占23G硬盘空间之后,最终以失败告终。

QT4.7.0静态编译难道如此之难!

各位大牛帮帮我吧!
离线zhuhehz

只看该作者 1楼 发表于: 2010-11-13
大牛都不在吗?帮帮我吧!谢谢了!
离线zhuhehz

只看该作者 2楼 发表于: 2010-11-14
难道没有人成功静态编译过吗?
大家帮帮忙啊!
小弟先谢了!
离线dbzhang800

只看该作者 3楼 发表于: 2010-11-14
用静态编译的应该都是商业版吧?我想主要是国内用Qt商业版的不太多,而且买商业版的都会买服务,即使遇到问题也不用担心。
离线zhuhehz

只看该作者 4楼 发表于: 2010-11-15
回 3楼(dbzhang800) 的帖子
那如何解决程序在其它未安装QT和c++环境的电脑运行呢?请多指教!
离线happyday23

只看该作者 5楼 发表于: 2010-11-15
发布的时候, 配置plugins地址, 把相关的动态库都拷贝到你的程序目录中
离线zhuhehz

只看该作者 6楼 发表于: 2010-11-15
回 5楼(happyday23) 的帖子
请您详解!
1.如何配置plugins地址?

2.如何知道相关的动态库都是什么?

不胜感谢!
离线xtfllbl

只看该作者 7楼 发表于: 2010-11-15
Re:回 5楼(happyday23) 的帖子
引用第6楼zhuhehz于2010-11-15 09:41发表的 回 5楼(happyday23) 的帖子 :
请您详解!
1.如何配置plugins地址?
2.如何知道相关的动态库都是什么?
.......

请参考qt文档中关于如何发布的手册。
上海欢迎您
离线zhuhehz

只看该作者 8楼 发表于: 2010-11-15
回 7楼(xtfllbl) 的帖子
请教版主,如何正确静态编译QT?
网上的资料比较烦乱,而且各不大相同。
默认的configure是编译成功了,静态的不行!难道QT(非商业版)静态编译只是传说!
离线dbzhang800

只看该作者 9楼 发表于: 2010-11-15
Re:回 7楼(xtfllbl) 的帖子
引用第8楼zhuhehz于2010-11-15 19:34发表的 回 7楼(xtfllbl) 的帖子 :
请教版主,如何正确静态编译QT?
网上的资料比较烦乱,而且各不大相同。
默认的configure是编译成功了,静态的不行!难道QT(非商业版)静态编译只是传说!


我想确认一下:难道你真的不清楚你的 Qt  已经静态编译成功了?
离线zhuhehz

只看该作者 10楼 发表于: 2010-11-16
回 9楼(dbzhang800) 的帖子
configure默认参数是编译成功了,但默认的不是静态的。

所以,VS2005\项目属性\从C/C++\代码生成\运行时库选择“多线程(/MT)”,报如下错误。(选择/MD就正常)
1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已经在 LIBCMT.lib(typinfo.obj) 中定义
1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) 已经在 LIBCMT.lib(typinfo.obj) 中定义
离线dbzhang800

只看该作者 11楼 发表于: 2010-11-16
Re:回 9楼(dbzhang800) 的帖子
引用第10楼zhuhehz于2010-11-16 09:23发表的 回 9楼(dbzhang800) 的帖子 :
configure默认参数是编译成功了,但默认的不是静态的。
所以,VS2005\项目属性\从C/C++\代码生成\运行时库选择“多线程(/MT)”,报如下错误。(选择/MD就正常)
1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已经在 LIBCMT.lib(typinfo.obj) 中定义
1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) 已经在 LIBCMT.lib(typinfo.obj) 中定义

你能介绍一下,从下载Qt源码,到你看到这个错误,你都做了什么吗? (200字以内即可)
离线zhuhehz

只看该作者 12楼 发表于: 2010-11-16
回 11楼(dbzhang800) 的帖子
ok!
1.下载QT源码qt-everywhere-opensource-src-4.7.0.zip,解压缩。路径为:C:\Qt\4.7.0
2.按照网上说的修改环境变量
  (1)QTDIR= C:\Qt\4.7.0
  (2)Path添加;%QTDIR%\bin
  (3)QMAKESPEC=win32-msvc2005
3.进入VS2005命令行,切换路径至C:\Qt\4.7.0
4.configure
5.nmake
7.等待完成,一共5个多G。
8.拷贝到家里的台式电脑(家中电脑configure报错,一堆没找到。无奈只有将在公司编译好的拷贝回家),路径为C:\Qt\4.7.0
9.新建QT工程,自己编写了一个ADSL自动拨号计时的小软件。
10.VS2005\项目属性\从C/C++\代码生成\运行时库选择“多线程(/MD),成功生成可执行文件,且能够运行(拨号计时均可)。
11.我把生成的可执行文件拷贝到家中笔记本中不能运行(笔记本中无VS也没有QT库),于是在台式电脑中修改VS2005\项目属性\从C/C++\代码生成\运行时库选择“多线程(/MT),于是出现了如下错误:
1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已经在 LIBCMT.lib(typinfo.obj) 中定义
1>msvcrt.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) 已经在 LIBCMT.lib(typinfo.obj) 中定义
12.上网查需说是QT不是静态库,需静态编译。
13.到现在静态编译仍然不成功。

请您帮我分析,感谢!
离线dbzhang800

只看该作者 13楼 发表于: 2010-11-16
首先,你要清楚你自己需要什么。

所谓Qt静态编译,一般来说是指编译的程序不依赖Qt的动态库 (QtCore4.dll QtGui4.dll等)。这个没什么好说的,和动态编译的区别只不过 configure 时多了一个 -static 参数。

但你这儿描述的是,你不想让你的程序不依赖C、C++的运行库。如何实现??显然,编译程序程序时用 /MT, 而不是/MD. 但很容易理解,你编译QtCore.lib 等静态库时,也需要 /MT 而不是 /MD (注:这儿前提是MSVC)

http://hi.baidu.com/cyclone/blog/item/25b262d9337a172310df9b78.html
离线dbzhang800

只看该作者 14楼 发表于: 2010-11-16
至于你11中提到的前半句,用VS2005应该都了解才对。VS2005编译的程序发布时需要相应的 可再发行包。
离线zhuhehz

只看该作者 15楼 发表于: 2010-11-16
回 13楼(dbzhang800) 的帖子
我就是需要我的程序生成的可执行文件不依赖于任何库才去QT静态编译和在VS2005中选择/MT,这才出现的错误的!

我没有理解错啊!

而且就是configure 时个多了一个 -static 参数,就不成功了!我才来请教大家的。
离线zhuhehz

只看该作者 16楼 发表于: 2010-11-23
自己顶起,等待高人!
离线dbzhang800

只看该作者 17楼 发表于: 2010-11-24
回 16楼(zhuhehz) 的帖子
如果你真清楚的话,编译Qt的时候,应该就会用 MT 而不是用 MD 了。
离线zhuhehz

只看该作者 18楼 发表于: 2010-11-24
回 17楼(dbzhang800) 的帖子
你是指将qmake.conf中的QMAKE_CFLAGS_RELEASE 和 QMAKE_CFLAGS_DEBUG 中的 -MD -MDd 分别修改为 -MT 和 -MTd吗?

我已经这样做了!


我觉得编译QT有好多未知因素(至少我不知道),因为默认编译下我的两台电脑一台成功,另一台失败。我认为可能是因为这两台电脑的操作系统版本不太一样,虽然都是番茄花园的WIN XP但版本不一样。

希望高手为我一个成功的案例。网上的资料是在是晕,有好多不一样的地方。
离线roywillow

只看该作者 19楼 发表于: 2010-11-24
这个是我静态编译时候参考的资料

平台:windows7          软件:qt4.6+qt creator 1.3     使用的安装包是  qt-sdk-win-opensource-2009.05.exe

问题描述:
        (1)使用qt creator 生成工程,写好程序进行编译运行,在qt creator点击运行,程序能跑起来,没问题,可是我在工程目录下找到编译生成的程序双击运行时,提示缺少mingwm10.dll,无法运行。
        (2) 按照 http://wiki.qtcentre.org/index.php?title=Building_static_Qt_on_Windows#MinGW 这个方法完成操作以后,使用qt creator 不能用debug,只能使用release选项,使用debug选项产生的错误提示是:collect2:ld returned 1 exit status    通过查找资料发现是缺少debug库

解决方案:
        (1)编辑 C:\Qt\2009.05\qt\mkspecs\win32-g++\qmake.conf 文件 把 QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
                          改为:QMAKE_LFLAGS = -static -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
        (2)在开始菜单里找到Qt Command Prompt并运行,输入命令:   configure -static -debug-and-release -no-exceptions
                (3)上一条命令运行成功后再输入命令:   mingw32-make sub-src
等1 ~3 小时可能就运行完了   完成后就ok了。。。

是不依赖vc库的应该,因为用的是MinGW的库吧……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线anubiskong

只看该作者 20楼 发表于: 2010-12-06
program files 文件夹的名字有空格,这个好像mingw32-make识别不了,所以他把那个空格当成是真正的空格了,而不是文件夹名

这个有点悲剧,我没有办法
离线nizvoo

只看该作者 21楼 发表于: 2010-12-07
4.7我覺得動態編譯都是問題很多,能編譯成功。但是使用一些問題,我還是用4.6.2
快速回复
限100 字节
 
上一个 下一个