我想从一个简单的链接用法开始来解释我的问题。假设有一个库z
可以编译为共享库 libz.dll(D:/libs/z/shared/libz.dll) 或静态库 libz.a (D:/libs/z/static/libz.dll)。一种)。
让我想链接它,然后我这样做:
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
同时搜索共享库和静态库?
如果我编译共享库发行版,为什么有些开发人员会为相同的模块提供带有 .dll 文件的 .a 文件?
例如,Qt 在 bin 目录中提供 .dll 文件,在 lib 目录中提供 .a 文件。它是同一个库,但分别像共享和静态一样构建吗?或者 .a 文件是某种提供与共享库链接的虚拟库,哪里有真正的库实现?
另一个例子是 Windows 上的 OpenGL 库。为什么每个编译器都必须在 MingW 中提供像 libopengl32.a 这样的静态 OpenGL 库?
带有 .dll.a 和 .la 扩展名的文件有什么用途?
PS这里的题很多,但是我觉得每题都依赖上一个题,没必要拆成几个题。