使用Qt项目进行静态链接

4

我有一个在Visual Studio 2010 Professional中构建的Qt项目。但是,当我运行它(无论是在Debug还是Release模式下),它会要求一些Qt dll文件。如果我提供这些dll并将它们放入System32中,它就可以工作。但我的问题是,如何使所有库都包含在.exe文件中?我已经拥有了所有需要的静态库,只是不知道如何使应用程序不要请求最终用户提供它们。

1个回答

6

正确的方法是创建一个安装程序,与您的应用程序一起安装Qt库。 Visual Studio带有一个设置项目模板,可以使用它轻松创建自己的定制安装程序。由于众多原因,静态链接通常不是一个好的选择。

但是,如果您坚持要进行静态链接,则需要重新编译带有-static标志的Qt源代码。
有一个演练可用于Qt 4 这里

如果您正在使用LGPL版本的Qt,请确保已阅读此问题的答案,并适当地解决了部署中的所有法律问题。


我确实想知道如何配置,以便只有少数库被静态链接,而其余的库(未来可能需要更新/修复的库)将被动态链接? - DMK741
@user: 我很确定这是不可能的。你要么全部获取Qt库,要么不获取。你可以静态链接Qt库,但不能静态链接Microsoft的C/C++运行时库(或反之亦然)。但我不确定为什么你想要这样做。如果你的目标是消除所有依赖项并发布单个EXE,则静态链接是你唯一的选择。如果你愿意有某些依赖项,则您应该构建安装程序,并将它作为您的单个EXE发布。这对用户来说是一个额外的步骤,但真的可以减少头痛! - Cody Gray
有点离题,但我想知道为什么静态链接不是一个好的选择?我在谷歌上找不到太多相关信息,我想了解这个问题,以便我能说服我的客户放弃静态链接(这对于Qt来说总是一场噩梦)。 - laurent
@Laurent:嗯,我可以想到几个缺点,但很少有(如果有的话)是能说服客户的。理想情况下,双方关系良好,他们信任您作为开发人员的判断,并遵循您的建议。如果没有这种情况,我可以想到两个不同的选择。第一个选择是用静态链接阻止客户获得运行时库发布的安全更新,从而使他们感到恐慌。当应用程序被静态链接时,您必须发布一个全新版本,并将其部署到所有客户机上,才能利用任何... - Cody Gray
最新版本的库可能已经进行了安全性改进。而运行时库的新版本要小得多,可以独立部署,并且通常由Windows Update推送(当然,这不适用于Qt)。第二种方法(这是我最喜欢的)是向他们展示创建安装程序有多么容易。Inno Setup是我个人最喜欢的解决方案,但VS也内置了此功能。您可以创建一个设置程序,它相当于单个EXE,就像单个EXE应用程序一样容易部署。用户所需做的就是点击“安装”。 - Cody Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接