问题说了所有的事情。我正在使用Qt Creator,它使用QMake,我想构建一个.so
共享库文件,其所有依赖关系都是静态链接的。像libstdc++
等等。
但是当我使用CONFIG += static
时,它也会将库更改为静态库并生成.a
静态文件,我不想要它。 所以我的问题不是this的重复。
我搜索了here,但我找不到任何合适的东西。
答案 0 :(得分:0)
CONFIG += static
是错误的标志,如文档中所述:
目标是静态库(仅限lib)。适当的编译器标志 将自动添加到项目中。
如果要静态链接依赖项并生成共享库,则需要将标记传递给链接器,因此将QMAKE_LFLAGS += -static
添加到.pro
文件中。
一个简单的测试会产生一个没有该标志的16kb dll,以及一个995kb的dll。此外,如果要信任依赖者walker,则较大的dll没有外部依赖性,而较小的dll依赖于libgcc
和libstdc++
(这只是一个简单的std::cout
测试)。
显然,你真的不需要静态qt或qmake构建。测试了“库存”32位mingw版本的Qt。
答案 1 :(得分:-1)
你需要三件事:
对于所有这些,您需要使用-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 !)。