如何在 Qt Creator 的共享库中进行静态链接?
How to have static linkage in a shared library in Qt Creator?
这个问题说明了一切。我正在使用 Qt Creator,它使用 QMake,我想构建一个 .so
共享库文件,它的所有依赖项都是静态链接的。点赞libstdc++
,等等
但是当我使用 CONFIG += static
时,它还会将库更改为静态库并生成一个 .a
静态文件,这是我不想要的。 所以我的问题不是 this 的重复问题。
我搜索了here,但找不到合适的东西。
你需要三样东西:
- 您需要将 Qt 本身构建为静态库:
- 您需要将 Qt 静态 link 编辑到运行时。
- 您需要 link 将您的库静态地添加到运行时。这是自动处理的。
对于所有这些,您需要使用 -static -static-runtime
个参数配置自定义 Qt 构建。您使用此 Qt 构建的任何 executable/library 将静态 linked 到运行时并静态 linked 到 Qt(如果它使用 Qt)。
值得注意的是,上述 none 需要对项目的 .pro
文件进行任何更改。相反,一般来说,您无法对项目文件做任何事情来获得相同的效果。您必须构建一个正确配置的 Qt,一切都将从那里处理。
你的库本身不需要使用 Qt,除了有一个管理构建的项目文件。例如,这将是一个不使用 Qt nor C++:
的基本库
TARGET = mylib
TEMPLATE = lib
CONFIG -= qt
SOURCES = mylib.c
HEADERS = mylib.h
只要您从如上配置的 Qt 调用 qmake
,共享库就不会动态 link 到语言运行时(也不会到 Qt,但在这种情况下它不会'完全 link 到 Qt!)。
CONFIG += static
是错误的标志,如文档所述:
The target is a static library (lib only). The proper compiler flags
will automatically be added to the project.
如果你想 link 静态依赖,并生成一个共享库,你需要传递一个标志给 linker,所以将 QMAKE_LFLAGS += -static
添加到你的 .pro
文件.
一个简单的测试会产生一个没有该标志的 16kb dll 和一个带有它的 995kb dll。此外,如果依赖 walker 是可信的,较大的 dll 没有外部依赖,而较小的依赖 libgcc
和 libstdc++
(它只是一个微不足道的 std::cout
测试)。
很明显,您并不需要静态 qt 或 qmake 构建。使用 "stock" 32 位 mingw 版本的 Qt 进行测试。
这个问题说明了一切。我正在使用 Qt Creator,它使用 QMake,我想构建一个 .so
共享库文件,它的所有依赖项都是静态链接的。点赞libstdc++
,等等
但是当我使用 CONFIG += static
时,它还会将库更改为静态库并生成一个 .a
静态文件,这是我不想要的。 所以我的问题不是 this 的重复问题。
我搜索了here,但找不到合适的东西。
你需要三样东西:
- 您需要将 Qt 本身构建为静态库:
- 您需要将 Qt 静态 link 编辑到运行时。
- 您需要 link 将您的库静态地添加到运行时。这是自动处理的。
对于所有这些,您需要使用 -static -static-runtime
个参数配置自定义 Qt 构建。您使用此 Qt 构建的任何 executable/library 将静态 linked 到运行时并静态 linked 到 Qt(如果它使用 Qt)。
值得注意的是,上述 none 需要对项目的 .pro
文件进行任何更改。相反,一般来说,您无法对项目文件做任何事情来获得相同的效果。您必须构建一个正确配置的 Qt,一切都将从那里处理。
你的库本身不需要使用 Qt,除了有一个管理构建的项目文件。例如,这将是一个不使用 Qt nor C++:
的基本库TARGET = mylib
TEMPLATE = lib
CONFIG -= qt
SOURCES = mylib.c
HEADERS = mylib.h
只要您从如上配置的 Qt 调用 qmake
,共享库就不会动态 link 到语言运行时(也不会到 Qt,但在这种情况下它不会'完全 link 到 Qt!)。
CONFIG += static
是错误的标志,如文档所述:
The target is a static library (lib only). The proper compiler flags will automatically be added to the project.
如果你想 link 静态依赖,并生成一个共享库,你需要传递一个标志给 linker,所以将 QMAKE_LFLAGS += -static
添加到你的 .pro
文件.
一个简单的测试会产生一个没有该标志的 16kb dll 和一个带有它的 995kb dll。此外,如果依赖 walker 是可信的,较大的 dll 没有外部依赖,而较小的依赖 libgcc
和 libstdc++
(它只是一个微不足道的 std::cout
测试)。
很明显,您并不需要静态 qt 或 qmake 构建。使用 "stock" 32 位 mingw 版本的 Qt 进行测试。