.dll
或是.so
共享库(在运行时链接),而.a
和.lib
是静态库(在编译时链接)。Windows和Linux之间没有区别。
不同之处在于它们的处理方式。注意:区别仅在于海关,如何使用。使Linux以Windows方式构建并不难,反之亦然,除非实际上没有人这样做。
如果我们使用dll,或者甚至从我们自己的二进制文件中调用函数,则有一种简单明了的方法。例如,在C中,我们看到:
int example(int x) {
...do_something...
}
int ret = example(42);
但是,在asm级别上可能会有很多差异。例如,在x86上,call
执行一个操作码,并42
在堆栈上给出。或在某些寄存器中。或任何地方。没有人知道在编写dll之前将如何使用它。或项目将如何使用它,可能是用现在还不存在的编译器(或用一种语言!)编写的(或者对于dll的开发人员来说是未知的)。
例如,默认情况下,C和Pascal都从堆栈中放入参数(并获取返回值),但是它们的执行顺序不同。您还可以通过某些编译器相关的优化在寄存器中的函数之间交换参数。
如您所见,Windows习惯是构建一个dll,我们还使用它创建了一个minimal .a
/ .lib
。这个最小的静态库只是一个包装,该dll的符号(函数)通过它到达。这将进行所需的asm级调用转换。
它的优点是兼容性。它的缺点是,如果只有.dll,则可能很难弄清楚如何调用其函数。如果dll的开发人员没有向您提供.a
,则这将使dll的使用成为黑客行为。因此,它主要用于封闭性目的,例如,这样可以更轻松地为SDK获得额外的现金。
它的另一个缺点是,即使使用动态库,也需要静态编译此小包装程序。
在Linux中,dll的二进制接口是标准的,并且遵循C约定。因此,不需.a
要这样做,并且共享库之间存在二进制兼容性,但作为交换,我们没有Microsoft自定义的优点。