Sul*_*lla 75 c++ dll linker static-libraries
什么是静态库的.lib文件,静态链接的动态库和动态链接的动态库?
为什么在动态链接的动态库中不需要.lib文件,而且在静态链接中,.lib文件只是一个包含所有方法的.obj文件.那是对的吗?
Ant*_*ams 131
对于静态库,.lib文件包含库的所有代码和数据.然后,链接器识别它需要的位并将它们放入最终的可执行文件中.
对于动态库,.lib文件包含库中导出的函数和数据元素的列表,以及有关它们来自哪个DLL的信息.当链接器构建最终的可执行文件时,如果使用库中的任何函数或数据元素,则链接器会添加对DLL的引用(导致它由Windows自动加载),并将条目添加到可执行文件的导入表中,以便对函数的调用被重定向到该DLL.
您不需要.lib文件来使用动态库,但如果没有它,则无法将DLL中的函数视为代码中的常规函数.相反,您必须手动调用LoadLibrary以加载DLL(并FreeLibrary在您完成时),并GetProcAddress获取DLL中的函数或数据项的地址.然后,必须将返回的地址强制转换为适当的指向函数的指针才能使用它.
irs*_*sis 12
我发现Hans的以下答案在这里也很有用.它清除了可以有两种类型的lib文件的空气.
LIB文件用于构建程序,它只存在于您的构建计算机上,而您不会发送它.有两种.静态链接库是一包.obj文件,收集到一个文件中.当链接器需要解析外部标识符时,链接器会从文件中选择任何代码块.
但是与DLL更相关,LIB文件也可以是导入库.它是一个简单的小文件,包含DLL的名称和DLL导出的所有函数的列表.在构建使用DLL的程序时,您需要将它提供给链接器,以便它知道外部标识符实际上是DLL导出的函数.链接器使用导入库将条目添加到EXE的导入表中.然后Windows在运行时使用它来确定需要加载哪些DLL来运行程序.
在静态库中,lib文件包含库提供的函数的实际对象代码.在共享版本(您称之为静态链接动态库)中,只有足够的代码可以在运行时建立动态链接.
我不确定"动态链接动态库"(以编程方式加载).在这种情况下你甚至链接.lib?
编辑:
来晚了一点,但不,你没有链接.lib.好吧,你用libloaderex链接到lib.但对于您正在使用的实际库,您可以通过C函数指针提供自己的绑定,并使用loadlibrary填充它们.
这是一个总结:
Linking ? Static | DLL | LoadLibrary =========?===============|======================|=================== API code ? In your com- | In the DLL | In the DLL lives ? piled program | | ---------?---------------|----------------------|------------------- Function ? Direct, may | Indirect via table | Indirect via your calls ? be elided | filled automatically | own function ptrs ---------?---------------|----------------------|------------------- Burden ? Compiler | Compiler/OS | You/OS
链接器读取一个lib文件,并在执行期间使用一个dll文件。lib文件在执行过程中基本上是没有用的,并且链接程序无法读取 dll文件(除非可能以与此处无关的方式)。
使用lib文件进行静态链接和动态链接之间的差异可能会令人困惑,但是如果您了解一些历史记录,那么它将变得非常清楚。
最初只有静态库。对于静态库,.lib文件包含obj文件。每个obj文件都是一个且只有一个编译器源代码输入文件的输出。lib文件只是相关obj文件的集合,就像将obj文件放在目录中一样。从本质上讲,这就是一个lib文件,一个obj文件库。对于静态链接,可执行文件使用的所有obj文件都组合到一个文件中。将其与动态链接进行比较,在动态链接中,可执行文件与它使用的其他代码位于单独的文件中。
为了实现动态链接,Microsoft修改了lib文件的用法,使它们引用的是dll文件而不是obj文件中的位置。除此之外,静态链接库中的所有信息都与动态链接相同。除了动态链接的lib文件指定dll文件外,它们与它们中的信息完全相同。