2016-11-28 150 views
0

这个问题说明了所有的事情。我正在使用Qt Creator,它使用QMake,我想构建一个共享库文件,它具有静态链接的所有依赖关系。像libstdc++如何在Qt Creator的共享库中建立静态链接?

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

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

回答

0

CONFIG += static是错误的标志,如文件规定:

The target is a static library (lib only). The proper compiler flags will automatically be added to the project.

如果你想静态链接的相关性,并产生一个共享库,你需要一个标志传递给链接器,所以加QMAKE_LFLAGS += -static到您的.pro文件。

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

显然,你并不需要一个静态的qt或qmake构建。使用Qt的“stock”32bit mingw版本进行测试。

+0

当我使用CONFIG + = static时,它编译好没有错误。但是当我使用QMAKE_LFLAGS + = -static它让我看到这些错误: 错误:无法找到-lgnustl_shared 错误:无法找到-llog 错误:找不到-lz 错误:无法找到-ldl –

+0

如果你想静态链接到图书馆,您必须拥有该图书馆的静态版本。 '-lgnustl_shared'听起来很像它是一个共享库,通常没有'_shared'后缀,链接器会查找库的'.a'版本,但在你的情况下,没有这种东西。实际的库是'-lgnustl_static'。没有这个标记,你不会得到错误,因为如果没有它,你根本就没有静态链接。 – dtech

+0

我再说一遍,当我使用CONFIG + = static时,它编译好没有错误。 –

-1

您需要三样东西:

  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!)。

+0

1 - 为什么?他想做的是制作一个共享库,它静态链接自己的依赖关系。 – dtech

+0

使用QMAKE_LFLAG_RELEASE怎么样? –

+0

@ddriver因为如果你没有Qt的静态构建,那么Qt依赖不能被静态满足:静态链接的对象存档不存在。 –