将静态 Qt 库链接到 c 程序

Posted

技术标签:

【中文标题】将静态 Qt 库链接到 c 程序【英文标题】:Link static Qt library to c program 【发布时间】:2014-05-05 13:16:45 【问题描述】:

我需要链接到一个库(我自己用 Qt 编写的)。当然,由于 C++ 依赖项(stdc++ Qt),这会在链接期间产生(不管extern "C" 和名称修饰的东西)很多错误。

所以我有一个想法,但我不确定我是否遗漏了什么或者该方法是否是一个现实的解决方案:

搜索一些关于这个话题的提示,我找到了一篇关于building static Qt的文章。在没有详细阅读所有内容的情况下,我认为解决方案可能是静态编译 Qt,然后将我的应用程序链接到这个静态版本的 Qt。在我看来,这应该会导致构建成功,原因如下:

    使用静态 Qt 库(再次作为静态库)构建我的 Qt 库将解决所有依赖项,因为它们都在静态库存档中。

    由于extern "C"d 接口函数将被c 应用程序访问,C 编译器(和链接器)也将看到所有依赖关系都已解决,这也没有问题。

    李>

现在在尝试静态构建 Qt 的繁琐步骤之前,我想知道这种方法是否可以解决问题。

编辑 1: 另一种解决方案是在应用程序的 Qt 和 C 部分之上实现服务器-客户端架构,并让它们以这种方式相互通信。

编辑 2: 可能最好的解决方案都不是提到的。相反,我只是写了一个动态链接的边界(正如 Laszlo Papp 和 dsu 所建议的那样),一切正常。

【问题讨论】:

一般我会同意你的假设,但你需要 Qt 的商业许可证或开源你的库(如果静态链接到你的库,则应用程序)。此外,根据您的需要(插件/SSL/等),为静态链接构建 Qt 可能会很痛苦。不要忘记创建静态链接的应用程序或库会显着增加大小,比提供所有 DLL 少,但仍足以为低带宽连接提供压力下载。 我只是忘记了不这样做的要点之一,升级应用程序、库或 Qt 总是需要您再次部署整个安装,而不是只更新共享链接应用程序。 我不确定这会如何工作。你的意思是你会在你的软件和 Qt 之间编写一个适配器来建立适当的 ABI? @LaszloPapp 现有的 Qt 代码将被扩展,以便它提供可以从 C 代码调用的函数。所以会有一个init函数,比如可能有一些getter和setter等等。我是否忽略了一些重要的事情? 无论如何...将所有这些链接在一起应该是可行的。我只是玩了一下,这很有效:89.238.76.97/david/linking_fun.tar.gz 也许你可以尝试在这些 cpp 文件中插入一些 qt 函数,看看它是否有效......(忘记 cpp_boundary.h 中的 extern C。那是错误的。) 【参考方案1】:

现在在尝试静态构建 Qt 的繁琐步骤之前,我想知道这种方法是否可以解决问题。

根据您提到的 cmets,成为 Digia 的商业客户是一个问题,我会说不。

专有软件不会发生静态链接,根据您的评论,您的项目不可开源。

话虽如此,无论如何您似乎都有自己的包装器,并且 Qt 为给定的主要版本保持二进制兼容性,其生命周期通常为几年,所以我个人会选择动态链接和某种绑定。

【讨论】:

顺便说一句,如果您的雇主试图“发布”、“出售”或“提供”专有程序的静态链接 Qt 可执行文件,那么他(可能是 IANAL)是非法行为,除非他购买了允许他这样做的 Qt 许可证。

以上是关于将静态 Qt 库链接到 c 程序的主要内容,如果未能解决你的问题,请参考以下文章

应用程序如何链接静态QT Plugin库

如何将qt静态库代码还原动态库

QT静态库静态编译

55.Qt-将界面程序封装成静态库

55.Qt-将界面程序封装成静态库

嵌入式 Linux C语言——静态库函数和动态库函数