Mingw gcc,“-shared -static”一起传递

Mingw gcc, "-shared -static" passing together

在 windows 下研究 Scintilla 的 makefile for MinGW 时,我注意到它正在传递 -shared-static 一起作为 LDFLAGS 到 gcc.

LDFLAGS=-shared -static -mwindows $(LDMINGW)


我用谷歌搜索,只从 clang 中找到了一些信息:https://reviews.llvm.org/D43811

[MinGW, CrossWindows] Allow passing -static together with -shared
In these combinations, link a DLL as usual, but pass -Bstatic instead of -Bdynamic to indicate prefering static libraries.


我的问题是:GCC 也会这样做吗?
我还没有找到任何证据。

您可以在 GCC linkage 中同时传递 -static-shared。他们的 综合效果与您在 llvm link 中描述的相同 GCC 一直都是这种情况。

-shared 指示 GCC linkage 生成共享库而不是程序, 它通过将选项 -shared 传递给它的调用来实现 linker.

-static 指示 GCC linkage 在解析时忽略共享库 输入库选项 -lname。默认情况下 -lname 将由 在指定的或默认的 linker 搜索目录中搜索 共享库 libname.so(在 Windows、[lib]name.dll 上) 或静态库 libname.a(在 Windows 上也 [lib]name.lib)并且更喜欢 共享库,如果它们都在同一目录中。 -static 简单地从搜索中排除所有共享库。 GCC 通过传递选项 -Bstatic 来实现这一点 通过在生成的 linker 中的某个位置调用 linker 所有 -lname 选项之前的命令行。

GNU linker documentation of -Bstatic 是明确的 该选项与-shared一致,效果是产生一个共享库 所有其依赖库都已静态解析。

-Bstatic

-dn

-non_shared

-static

Do not link against shared libraries. This is only meaningful on platforms for which shared libraries are supported. The different variants of this option are for compatibility with various systems. You may use this option multiple times on the command line: it affects library searching for -l options which follow it. This option also implies --unresolved-symbols=report-all. This option can be used with -shared. Doing so means that a shared library is being created but that all of the library’s external references must be resolved by pulling in entries from static libraries.

(强调我的)。

尽管共享库的静态 linkage 原则上只是一个 linkage 限制 同static linkage of a program一样,实际中经常遇到 Unix 和 Linux 上的障碍,因为所有目标代码 link 都进入了 ELF 共享库 libname.so 必须是 Position Independent Code, 由 GCC 编译选项 -fPIC 生成,而目标文件 归档在静态库中的通常不使用 -fPIC 编译。链接使用 -shared ... -static 因此容易失败,因为必要的静态库包含 非 PIC 目标文件。

然而,在 Windows 上使用 GCC,您不必担心,因为 在 Windows PE 中没有像 PIC 与非 PIC 这样的区别 目标代码。