2012-12-08 79 views
1

我正在开发使用Qt 4.8.3和VS2008的本机C++应用程序。由于客户在裸机上运行应用程序,他们需要安装VC++ 2008 Redistribution包。所以我决定让它静态链接。使用Qt静态构建库链接错误

我将项目设置(C/C++>代码生成>运行时库)更改为/ MTd。也是 我再次编译Qt,这次使用以下命令建立静态建筑;最初发现在这个博客Static Qt with static CRT (VS 2008)

1- replaced -MD with -MT in lines QMAKE_CFLAGS_RELEASE and QMAKE_CFLAGS_DEBUG in %QDIR%\mkspecs\win32-msvc2008\qmake.conf 
2- nmake confclean 
3- configure -static -platform win32-msvc2008 -no-webkit 
4- nmake sub-src 

我编译Qt成功。但是当我再次尝试编译我的应用程序时,它给了我一些奇怪的错误。

1>Linking... 
1>qtmaind.lib(qtmain_win.obj) : error LNK2005: "public: bool __thiscall QBasicAtomicInt::deref(void)" ([email protected]@@QAE_NXZ) already defined in QtCored4.lib(QtCored4.dll) 
1>qtmaind.lib(qtmain_win.obj) : error LNK2005: "public: bool __thiscall QBasicAtomicInt::operator!=(int)const " ([email protected]@[email protected]) already defined in QtCored4.lib(QtCored4.dll) 
1>qtmaind.lib(qtmain_win.obj) : error LNK2005: "public: __thiscall QString::~QString(void)" ([email protected]@[email protected]) already defined in QtCored4.lib(QtCored4.dll) 

我改变了一些lib文件,但随着每次更改,情况变得更糟;例如我试图使用QtCored.lib而不是QtCored4.lib,因为它是在编译后新创建的。

我想我已经错过了建立静态Qt库的东西。

回答

0

虽然这个问题自2012年底以来一直未得到答复,但我认为在这个问题上进一步填充一般知识可能是一个好主意,以便每个线程至少显示一个响应。

此问题源于在链接过程中包含QtCored4.dll和QtGuid4.dll时静态构建Qt。要从构建过程中排除这些,只需在配置Makefile时添加QT_NODLL作为预处理器指令即可。例如,这可以使用下面的命令(用于Microsoft Visual Studio 2008)来实现:运行NMAKE

configure -static -debug -D QT_NODLL -platform win32-msvc2008 

之前。

好的做法建立使用Visual Studio IDE静态的Qt应用程序时,修改项目配置类型的Makefile使用配置属性 - >常规 - >配置类型下拉菜单。一旦这些设置已经应用,用户还可以指定QMAKENMAKE步骤来执行的建立重建下配置属性 - >常规 - > NMAKE所有选项。

例如构建命令行静态调试配置是:

nmake debug 

而重建,都是等价的:

qmake app_debug.pro && nmake debug 

我希望这有助于!