如何在Qt Creator中的共享库中建立静态链接?

时间:2016-11-28 21:34:04

标签: c++ qt qmake static-linking

问题说了所有的事情。我正在使用Qt Creator,它使用QMake,我想构建一个.so共享库文件,其所有依赖关系都是静态链接的。像libstdc++等等。

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

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

2 个答案:

答案 0 :(得分:0)

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

  

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

如果要静态链接依赖项并生成共享库,则需要将标记传递给链接器,因此将QMAKE_LFLAGS += -static添加到.pro文件中。

一个简单的测试会产生一个没有该标志的16kb dll,以及一个995kb的dll。此外,如果要信任依赖者walker,则较大的dll没有外部依赖性,而较小的dll依赖于libgcclibstdc++(这只是一个简单的std::cout测试)。

显然,你真的不需要静态qt或qmake构建。测试了“库存”32位mingw版本的Qt。

答案 1 :(得分:-1)

你需要三件事:

  1. 您需要将Qt本身构建为静态库:
  2. 你需要说Qt静态链接到运行时。
  3. 您需要将库静态链接到运行时。这是自动处理的。
  4. 对于所有这些,您需要使用-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 !)。