【发布时间】:2013-04-06 15:26:45
【问题描述】:
我想从一个简单的链接用法开始来解释我的问题。假设有一个库 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,即
归档其成员为目标文件的文件
我还可以做到以下几点:
gcc -o main.exe main.o -LD:/libs/z/shared -lz
上面的文档中没有提到-l 标志将搜索lib<name>.so。
如果我的 libz.a 和 libz.dll 在同一个目录中会发生什么?库将如何与程序链接?如果 -l 同时搜索共享库和静态库,为什么我需要标志 -Wl,-Bstatic 和 -Wl,-Bdynamic?
如果我编译共享库发行版,为什么有些开发人员会为相同的模块提供带有 .dll 文件的 .a 文件?
例如,Qt 在 bin 目录中提供 .dll 文件,在 lib 目录中提供 .a 文件。它是同一个库,但分别像共享和静态一样构建吗?或者 .a 文件是某种提供与共享库链接的虚拟库,哪里有真正的库实现?
另一个例子是 Windows 上的 OpenGL 库。为什么每个编译器都必须提供像 MingW 中的 libopengl32.a 这样的静态 OpenGL 库?
.dll.a 和 .la 扩展名的文件有什么用途?
附:这里有很多问题,但我认为每个问题都取决于前一个问题,没有必要将它们分成几个问题。
【问题讨论】:
-
我们以cygwin为例:据我了解,用cygwin编译的程序需要一定的dll才能运行。 dll 绑定到某个许可证(免费许可证之一),并且必须存在于程序的主机系统上。如果您作为开发人员忘记将其与程序一起提供,则程序将无法运行。另一个例子是版本冲突的 DLL(即 opengl)。每个系统都有不同的功能,因此某些 DLL 的实现也不同。所以有时候开发者喜欢使用正确的库版本 => 静态链接。
标签: c++ gcc mingw static-linking dynamic-linking