我想从一个简单的链接用法开始解释我的问题。假设有一个库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
根据这份文档,gcc将搜索libz.a,它是“成员为目标文件的存档文件”。
我还可以执行以下操作:gcc -o main.exe main.o -LD:/libs/z/shared -lz
上面的文档中没有提到 -l
标志将会搜索 lib<name>.so
。
如果我在同一个目录中有 libz.a 和 libz.dll,会发生什么?库会如何链接到程序?为什么需要使用 -Wl,-Bstatic
和 -Wl,-Bdynamic
标志,如果 -l
既搜索共享库又搜索静态库?
为什么一些开发者为同一模块提供 .a 文件和 .dll 文件,如果我编译了共享库分发包呢?
例如,Qt 在 bin 目录中提供 .dll 文件,在 lib 目录中提供 .a 文件。它们是相同的库吗,但是分别构建为共享和静态库吗?还是 .a 文件是某种虚拟库,其提供与共享库的链接,而真正的库实现在其中?
另一个例子是 Windows 上的 OpenGL 库。为什么每个编译器都必须提供静态 OpenGL lib,例如 MingW 中的 libopengl32.a?
.dll.a 和 .la 扩展名的文件用途是什么?
P.S. 这里有很多问题,但我认为每个问题都取决于前一个问题,因此没有必要将它们拆分为多个问题。