我正在使用 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 库时遗漏了一些东西。