gpt4 book ai didi

c++ - 与 MinGW 的静态和动态/共享链接

转载 作者:IT老高 更新时间:2023-10-28 12:51:16 24 4
gpt4 key购买 nike

我想从一个简单的链接用法开始来解释我的问题。假设有一个库 z可以编译成共享库 libz.dll(D:/libs/z/shared/libz.dll) 或静态库 libz.a (D:/libs/z/static/libz.a)。

让我想链接它,然后我这样做:

gcc -o main.exe main.o -LD:/libs/z/static -lz

根据this documentation , gcc 会搜索 libz.a,即

archive files whose members are object files

我还可以做到以下几点:

gcc -o main.exe main.o -LD:/libs/z/shared -lz

上面的文档中没有提到-l标志将搜索 lib<name>.so .

如果我的 libz.a 和 libz.dll 在同一个目录中会发生什么?库将如何与程序链接?为什么我需要标志 -Wl,-Bstatic-Wl,-Bdynamic如果 -l同时搜索共享库和静态库?

如果我编译共享库发行版,为什么有些开发人员会为相同的模块提供带有 .dll 文件的 .a 文件?

例如,Qt 在 bin 目录中提供 .dll 文件,在 lib 目录中提供 .a 文件。它是同一个库,但分别像共享和静态一样构建吗?或者 .a 文件是某种提供与共享库链接的虚拟库,哪里有真正的库实现?

另一个例子是 Windows 上的 OpenGL 库。为什么每个编译器都必须提供像 MingW 中的 libopengl32.a 这样的静态 OpenGL 库?

.dll.a 和 .la 扩展名的文件有什么用途?

附:这里有很多问题,但我认为每个问题都取决于前一个问题,没有必要将它们分成几个问题。

最佳答案

请看一下ld and WIN32 (cygwin/mingw) .尤其是直接链接到 dll 部分,了解有关 -l 行为的更多信息。 LD 的 Windows 端口上的标志。摘录:

For instance, when ld is called with the argument -lxxx it will attempt to find, in the first directory of its search path,

libxxx.dll.a
xxx.dll.a
libxxx.a
cygxxx.dll (*)
libxxx.dll
xxx.dll

before moving on to the next directory in the search path.

(*) Actually, this is not cygxxx.dll but in fact is <prefix>xxx.dll, where <prefix> is set by the ld option -dll-search-prefix=<prefix>. In the case of cygwin, the standard gcc spec file includes -dll-search-prefix=cyg, so in effect we actually search for cygxxx.dll.

注意:如果您曾经使用 MinGW 构建过 Boost,您可能还记得 Boost 库的命名完全符合上面链接中描述的模式。

过去在 MinGW 中存在直接链接到 *.dll 的问题,所以建议创建一个静态库lib*.a*.dll 导出符号并链接到它。这个 MinGW wiki 页面的链接现在已经失效了,所以我认为直接链接到 *.dll 应该没问题。现在。此外,我用最新的 MinGW-w64 发行版自己做了几次,但都没有问题。

您需要链接标志 -Wl,-Bstatic-Wl,-Bdynamic因为有时您想强制静态链接,例如,当搜索路径中也存在同名的动态库时:

gcc object1.o object2.o -lMyLib2 -Wl,-Bstatic -lMyLib1 -Wl,-Bdynamic -o output

上面的代码片段保证了 -l 的默认链接优先级MyLib1 的标志被覆盖,即即使 MyLib1.dll存在于搜索路径中,LD 将选择 libMyLib1.a链接反对。请注意,对于 MyLib2 LD 将再次偏爱动态版本。

注意:如果 MyLib2取决于 MyLib1 ,然后 MyLib1也是动态链接的,不管 -Wl,-Bstatic (即在这种情况下它被忽略)。为了防止这种情况,您必须链接 MyLib2也是静态的。

关于c++ - 与 MinGW 的静态和动态/共享链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15852677/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com