【问题标题】:Qt 3rd Party Library Static Linking (QtSerialPort)Qt 3rd 方库静态链接 (QtSerialPort)
【发布时间】:2013-12-30 06:12:12
【问题描述】:

原来静态链接是有效的,但仅适用于 Qt 库。我的第 3 方库 QtSerialPort 没有静态链接。经过一番研究,我发现我要么必须静态构建这个库,要么必须直接链接到 .pro 文件中的 .pri 文件。

我不知道该怎么做,因为 QtSerialPort 似乎不是为静态链接而设计的。

.pri 方法我实在看不懂,在这两个链接中已经模糊描述了: http://qt-project.org/forums/viewthread/15223 http://www.qtcentre.org/archive/index.php/t-54505.html

有人对如何使这两种方法起作用有任何建议吗?或者可能是另一种方法?

另外,如果有人可以给我任何建议,MSVCP100.dll 不会静态链接。

================================================ ====================================

我正在尝试让 Qt 静态链接库,以便我可以制作一个独立的应用程序。我遵循了有关如何静态构建 Qt 然后构建静态应用程序的各种教程,但我运气不佳。我相信我已经成功地使用静态链接构建了 Qt,因为应用程序的大小从 79KB 增长到了 7+MB,但我仍然收到错误说 QtCore4.dll 和 QtSerialPort.dll 丢失。另外,我在使用这种静态配置时遇到的另一个不太严重的问题是,当我关闭我的程序时,Windows 认为它​​已经崩溃并给我一个窗口说 MyProgram.exe 已停止工作......

我在使用带有 Qt 4.8.5 的 MSVC 2010 的 Windows 机器上,并且正在使用第三方库 QtSerialPort。

根据我一直在阅读的指南,我所做的是:

下载并解压qt-everywhere-opensource-src-4.8.5.zip 打开 /mkspec/mwin32-msvc2010/qmake.conf 并将以下行更改为

CONFIG += qt warn_on release incremental flat link_prl precompile_header autogen_precompile_source copy_dir_files debug_and_release debug_and_release_target

和

QMAKE_CLFAGS_RELEASE = -O2 -MT

然后我打开 MSVC2010 命令提示符并 cd 到这个 .然后我输入命令

configure -static -release -platform win32-msvc2010
nmake sub-src

完成后我打开我的项目并添加

CONFIG += static

到 .pro 文件。在 QtCreator 中,我进入 Projects,Manage Kits,然后进入 Qt Versions 并浏览到我刚刚生成的 qMake。我用这个版本的 qMake 添加了一个新工具包。然后我清理所有并切换到这个新工具包并从 QtCreator 运行 qmake。然后我使用 msvc2010 命令提示符转到生成文件的目录,然后

nmake release

这会生成一个相当大的 .exe,但就像我说的,它仍然取决于几个 .dll。

【问题讨论】:

  • 在您的 exe 上运行 dependencywalker.com 可能会阐明您为什么具有 dll 依赖项。
  • 赞成。 QT 部署可能是一个挑战。
  • 我不确定是什么问题。您可以像任何基于 make 的项目一样静态构建 QtSerialPort。究竟是什么问题?
  • 您解决了这个问题吗?
  • Laszlo,当我尝试静态构建 QtSerialPort 时,我在编译时收到错误消息。当我这样做时,我将不得不重现错误并将其添加到此处,因为我忘记了它是什么。我静态构建了 QT 4.8.5,然后尝试使用该静态 qmake 构建 QtSerialPort。它行不通。与此同时,为了让我的代码正常工作,我静态构建了 Qt 5,它已经拥有 QtSerialPort 库并将其用于我的静态构建。我仍然想弄清楚这个问题,所以我会回复你。谢谢拉兹洛。

标签: c++ qt qt4 qtserialport


【解决方案1】:

对于外部库的静态链接,有几种选择,各有利弊。

我。自己编译静态链接库。链接到它。

  1. 为静态链接寻找可能的现有配置开关。库的.pro/.pri 文件中可能有QTSERIALPORT_STATIC = no 等内容。只需说yes 即可编译库以进行静态链接,然后转到第4 步!

  2. 在.pro/.pri 文件中将CONFIG += dll 替换为CONFIG += static。

  3. 从库中删除导出声明。通常,Qt 库符号是用一些定义声明的,例如 QTSERIALPORT_EXPORT,它在共享库构建/链接时的头文件使用中扩展为 Q_DECL_EXPORT/Q_DECL_IMPORT。您需要找到此 QTSERIALPORT_EXPORT 的定义位置并将其替换为空定义:

    #define QTSERIALPORT_EXPORT // in source file
    

    或

    DEFINES += QTSERIALPORT_EXPORT # in .pro/.pri file
    
  4. 构建库。

  5. 链接到库.lib/.a 文件,在项目中使用库头文件进行符号声明。

二。将库源文件包含到您的项目中并在其中编译它们(根本没有链接)。

  1. 将库的所有源文件包含到你的项目中(在qmake项目文件中添加SOURCES)

  2. 确定库所依赖的所有内容(其他库、Qt 选项等)并将其也包含到您的.pro 文件中。 要么 如果库作者为项目内编译提供了正确的.pri 文件(即include(QtSerialPort.pri) 或其他内容),请将其包含到您的.pro 中。

  3. 从库源代码中删除导出/导入声明 - 如第一部分第 3 项所述。

  4. 构建您的项目。

【讨论】:

  • 您在谈论如何静态链接,但正如他所提到的,OP 有一个特殊问题 CONFIG += static。我真的不明白你是如何解决手头的问题的。
  • 是的,@LaszloPapp,我正在解决同样的问题。 OP 想要静态链接,但不知道如何。
  • 他已经提到了如何。他面临的问题,它不起作用,他不知道为什么。 FWIW,我们的 QtSerialPort 库尚未针对静态链接进行太多测试,因此它甚至可能是我们软件中的错误。
  • "完成此操作后,我打开我的项目并添加 CONFIG += static"。这正是必须要做的,但这对他不起作用。您 NOT 解决了为什么这对他不起作用,这是他问题中的主要问题。作为图书馆的贡献者之一,如果没有进一步的信息,即使我也无法解决这个问题。 :)
  • 这显然意味着如果他知道如何静态链接他的库,他也知道如何为 QtSerialPort 做到这一点。此外,configure 也已经处理了静态 QtSerialPort。您的回答并没有试图解决问题,只是添加了不相关的文字墙。
猜你喜欢
  • 2014-09-02
  • 2020-01-13
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多