【问题标题】:Linking error while using Qt static built libraries使用 Qt 静态构建库时出现链接错误
【发布时间】:2017-04-26 23:38:21
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    尽管这个问题自 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 应用程序的一个好习惯是使用 Configuration Properties- 将项目配置类型修改为 Makefile - >常规->配置类型下拉菜单。一旦应用了这些设置,用户还可以指定 qmakenmake 步骤以执行 BuildRebuild All 选项位于 Configuration Properties->General->NMake

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

    nmake debug
    

    以及全部重建的等价物:

    qmake app_debug.pro && nmake debug
    

    我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多