【问题标题】:How to have static linkage in a shared library in Qt Creator?如何在 Qt Creator 的共享库中进行静态链接?
【发布时间】:2016-11-28 21:34:04
【问题描述】:

问题说明了一切。我正在使用 Qt Creator,它使用 QMake,我想构建一个 .so 共享库文件,它的所有依赖项都是静态链接的。比如libstdc++等等。

但是当我使用CONFIG += static 时,它也会将库更改为静态库并生成.a 静态文件,这是我不想要的。 所以我的问题不是 this 的重复。

我搜索了here,但找不到任何合适的东西。

【问题讨论】:

    标签: c++ qt qmake static-linking


    【解决方案1】:

    CONFIG += static 是错误的标志,如文档所述:

    目标是一个静态库(仅限 lib)。正确的编译器标志 将自动添加到项目中。

    如果你想静态链接依赖,并生成一个共享库,你需要传递一个标志给链接器,所以将QMAKE_LFLAGS += -static添加到你的.pro文件中。

    一个简单的测试会产生一个 16kb 的 dll 没有该标志,而一个 995kb 的 dll 带有它。另外,如果要信任依赖walker,较大的dll没有外部依赖,而较小的依赖libgcclibstdc++(这只是一个微不足道的std::cout测试)。

    显然,您并不需要静态 qt 或 qmake 构建。使用 Qt 的“股票”32 位 mingw 版本进行测试。

    【讨论】:

    • 当我使用 CONFIG += static 它编译正常,没有错误。但是当我使用 QMAKE_LFLAGS += -static 时,它会向我显示以下错误: 错误:找不到 -lgnustl_shared 错误:找不到 -llog 错误:找不到 -lz 错误:找不到 -ldl
    • 如果要静态链接到库,则必须具有该库的静态版本。 -lgnustl_shared 听起来很像它是一个共享库,通常没有_shared 后缀,链接器会查找库的.a 版本,但在你的情况下没有这样的东西。实际库是-lgnustl_static。没有那个标志你不会得到错误,因为没有它你根本就不是静态链接。
    • 我再说一遍,当我使用 CONFIG += static 时,它编译正常,没有错误。
    • 那么,使用CONFIG += static。没错,它已经在实践中建立起来,并通过文档验证它并没有达到你想要的效果。
    • @MatinLotfaliee 如果没有更具体的信息,我无法为您提供更具体的帮助。您使用什么构建工具,您的依赖项是什么......?答案已经包含了您通常需要执行的操作才能使其正常工作,因此如果它对您不起作用,则需要考虑其他一些变量。
    【解决方案2】:

    你需要三样东西:

    1. 您需要将 Qt 本身构建为静态库:
    2. 您需要将 Qt 静态链接到运行时。
    3. 您需要将库静态链接到运行时。这是自动处理的。

    对于所有这些,您需要使用 -static -static-runtime 参数配置自定义 Qt 构建。您使用此 Qt 构建构建的任何可执行文件/库都将静态链接到运行时并静态链接到 Qt(如果它使用 Qt)。

    值得注意的是,以上都不需要对项目的.pro 文件进行任何更改。相反,一般来说,您无法对项目文件执行任何操作来获得相同的效果。您必须构建一个正确配置的 Qt,一切都将从那里处理。

    除了有一个管理构建的项目文件外,您的库本身不需要使用 Qt。例如,这将是一个不使用 Qt C++的基本库:

    TARGET = mylib
    TEMPLATE = lib
    CONFIG -= qt
    SOURCES = mylib.c
    HEADERS = mylib.h
    

    只要您从如上配置的 Qt 中调用 qmake,共享库就不会动态链接到语言运行时(也不会链接到 Qt,但在这种情况下它根本不会链接到 Qt!) .

    【讨论】:

    • 1 - 为什么?他要做的是做一个共享库,静态链接自己的依赖。
    • 使用 QMAKE_LFLAG_RELEASE 怎么样?
    • @ddriver 因为如果您没有 Qt 的静态构建,则无法静态满足 Qt 依赖:静态链接的对象档案不存在。
    • @MatinLotfaliee 没什么。没关系,正如我在答案中所说,因为如果您没有静态构建的 Qt 来链接,则没有链接器选项可以解决这个问题。您需要有一个提供静态对象存档(.a 或静态.lib)的 Qt。您可以通过自己配置和构建来获得它。就这样。此外,Qt 已经知道为链接器提供哪些特定于平台的选项来静态链接运行时。要强制它使用这些选项,您需要使用-static-runtime 对其进行配置。
    • 好吧,我没有使用 Qt 库
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    相关资源
    最近更新 更多