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 这样的区别
目标代码。
在 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 这样的区别 目标代码。