首页 > 解决方案 > 如何在 Linux 上构建动态链接的 qt 应用程序(非共享库)

问题描述

我想构建一个与共享库链接的 qt 应用程序(就像 qt 应用程序默认做的那样)。但是 qt 总是将应用程序编译为共享库。我知道这是可能的,因为我发现了几个动态链接的 Linux 应用程序(不是共享库)。例如,大多数 KDE 应用程序都是用 Qt 编写的,但仍然是应用程序,而不是共享库。是否有允许我在 Linux 上构建 qt应用程序的编译器/链接器标志?没有答案-static,请。

标签: linuxqtshared-libraries

解决方案


它们不是共享库,而是普通的应用程序。

在现代 GNU/Linux 系统上,程序被编译为PIE(Position Indipendent Executable)。出于安全原因,这样做是为了允许text程序的部分(即代码)在每次运行程序时加载到一个新的随机地址。

从 ELF/内核的角度来看,加载 PIE 程序的过程与加载 PIC 共享库的过程非常相似,因此 PIE 可执行文件具有 ELF 类型ET_DYN,这是共享库使用的类型。

出于这个原因,一些程序,比如file(1),会将它们识别为共享库,但它们不是共享库。


推荐阅读