使用Qt静态构建库时链接错误

时间:2012-12-08 22:24:38

标签: c++ qt visual-studio-2008 static-libraries linkage

我正在使用Qt 4.8.3和VS2008开发本机C ++应用程序。由于客户端在裸机上运行应用程序,因此需要安装VC ++ 2008 Redistribution软件包。所以我决定把它静态联系起来。

我将项目设置(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)" (?deref@QBasicAtomicInt@@QAE_NXZ) already defined in QtCored4.lib(QtCored4.dll)
1>qtmaind.lib(qtmain_win.obj) : error LNK2005: "public: bool __thiscall QBasicAtomicInt::operator!=(int)const " (??9QBasicAtomicInt@@QBE_NH@Z) already defined in QtCored4.lib(QtCored4.dll)
1>qtmaind.lib(qtmain_win.obj) : error LNK2005: "public: __thiscall QString::~QString(void)" (??1QString@@QAE@XZ) already defined in QtCored4.lib(QtCored4.dll)

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

我认为我在构建静态Qt库时遗漏了一些东西。

1 个答案:

答案 0 :(得分:0)

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

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

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

在运行 NMAKE

之前

使用Visual Studio IDE构建静态Qt应用程序时的一个好习惯是使用 配置属性将项目配置类型修改为 Makefile - >常规 - >配置类型 下拉菜单。应用这些设置后,用户还可以指定要执行 构建 qmake nmake 步骤strong> 重建 配置属性 - > General-> NMake 下的所有 选项。

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

nmake debug

重建 - 所有等价物:

qmake app_debug.pro && nmake debug

我希望这有帮助!