Mingw gcc,“-“共享-静态”;一起通过

Mingw gcc,“-“共享-静态”;一起通过,gcc,static,mingw,ld,shared,Gcc,Static,Mingw,Ld,Shared,在windows下研究MinGW的闪烁时,我注意到它将-shared和-static作为LDFLAGS一起传递给gcc LDFLAGS=-shared-static-mwindows$(LDMINGW) 我在谷歌上搜索,只从clang那里找到了一些信息: [MinGW,CrossWindows]允许传递-静态和-共享 在这些组合中,像往常一样链接DLL,但传递-Bstatic而不是-Bdynamic以表示更喜欢静态库。 我的问题是:GCC也会这样做吗? 我还没有找到任何证据。您可以在GCC链

在windows下研究MinGW的闪烁时,我注意到它将
-shared
-static
作为
LDFLAGS
一起传递给gcc

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


我在谷歌上搜索,只从clang那里找到了一些信息:

[MinGW,CrossWindows]允许传递-静态和-共享
在这些组合中,像往常一样链接DLL,但传递-Bstatic而不是-Bdynamic以表示更喜欢静态库。


我的问题是:GCC也会这样做吗?

我还没有找到任何证据。

您可以在GCC链接中传递
-static
-shared
。他们的 组合效果与您在llvm链接中发现的效果相同, GCC的情况一直如此

-shared
指示GCC链接生成共享库而不是程序, 它通过将选项
-shared
传递到调用 链接器

-static
指示GCC链接在解析时忽略共享库 输入库选项
-lname
。默认情况下,
-lname
将由 在指定或默认链接器搜索目录中搜索 共享库
libname.so
(在Windows上,
[lib]name.dll
) 或者静态库
libname.a
(在Windows上也是
[lib]name.lib
)和 如果在同一目录中找到这两个库,则返回共享库<代码>-静态 只是从搜索中排除所有共享库。GCC通过传递选项
-Bstatic
直到在生成的链接器中的某个位置调用链接器 所有
-lname
选项前面的命令行

答案是明确的 此选项与
-shared
一致,其效果是生成一个共享库 其所有依赖库都已静态解析

-Bstatic

-dn

-非共享

-静止的

不要链接到共享库。这仅在支持共享库的平台上才有意义。 此选项的不同变体用于与各种系统兼容。您可以在命令行上多次使用此选项: 它会影响库对其后面的-l选项的搜索。此选项还意味着--unresolved symbols=report all。 此选项可与-shared一起使用。这样做意味着正在创建一个共享库,但必须通过从静态库中提取条目来解析库的所有外部引用。

(我的重点)

虽然共享库的静态链接原则上只是一个受限链接 与程序的静态链接一样,在实践中它经常遇到 Unix和Linux上的一个障碍,因为所有的目标代码都链接到一个ELF共享库中
libname.so
必须, 由GCC编译选项
-fPIC
生成,而目标文件 静态库中的存档通常不使用
-fPIC
编译。链接使用
-共享-静态
因此容易失败,因为必要的静态库包含 非PIC对象文件

但是,您不必担心Windows上的GCC,因为 没有像图五那样的区别。Windows中的非PIC 目标代码