我知道这对极客来说似乎很基础.但我想说清楚.
当我想使用Win32 DLL时,通常我只需要调用像LoadLibrary()和GetProcAdderss()这样的API.但最近,我正在使用DirectX9进行开发,我需要添加d3d9.lib,d3dx9.lib等文件.
我听说LIB用于静态链接,DLL用于动态链接.
所以我目前的理解是LIB包含方法的实现,并在链接时静态链接作为最终EXE文件的一部分.虽然DLL在运行时动态加载,但不是最终EXE文件的一部分.
但有时候,DLL文件会附带一些LIB 文件,因此:
检查维基百科后,我记得这些LIB文件称为导入库.但我想知道它如何与我的主应用程序和动态加载的DLL一起工作.
正如RBerteig所说,LIB文件中存在一些与DLL一起出现的存根代码.所以调用序列应该是这样的:
我的主要应用 - > LIB中的stub - >真正的目标DLL
那么这些LIB应包含哪些信息?我能想到以下几点:
我对吗?还有什么吗?
顺便说一句:有没有可以检查导入库的工具?如果我能看到它,就不会再有疑惑了.
我的背景是C#,但我必须维护一些遗留(MS)C++.在那个代码库中我弄明白:
#pragma comment(lib, "OtherLib700.lib")
Run Code Online (Sandbox Code Playgroud)
其中700是一些版本.除了lib是一个具有相同名称的DLL.
我首先想到的程序将依赖于DLL,但在从系统中删除后,程序仍然有效.但是有一个更新版本的DLL,名为OtherLib900 ...
似乎程序"包含"了lib的代码,因此它不再依赖于外部DLL.(或者程序'自动'使用较新的DLL ...)
哪一个是正确的?是否有办法进一步确认"假设"?
在链接方面有一些我不理解的事情......我正在使用第三方库(GEOS库)编写程序.此程序依赖于geos.lib但仍需要运行geos.dll.
我读了这个问题,我想我理解静态库和动态库之间的区别.我不明白的是为什么我静态链接库时仍然需要一个dll.
情况:
我正在使用VS2010构建一个库,它依赖于LibraryA.我只使用LibraryA提供的许多功能之一,所以我想静态链接它.
我正在阅读的所有内容告诉我将整个项目设置为静态链接到MFC,这是我不想做的事情.我的库很好地动态链接到windows DLL; 我只是想静态链接到LibraryA.
闲逛选项窗口,我似乎没有看到这样的选择.真的全有或全无吗?
谢谢,-Ben
我怎么能告诉一个.lib文件是一个静态库vs一个DLL的导入库?有没有可以做到这一点的工具或命令?
第二个问题是我如何检查静态库的依赖关系,我的意思是我怎么知道这个静态库中包含哪些DLL?
感谢您的帮助.
最好的祝福,
直观地:
.dll(动态链接)/ .lib(静态链接)。.so/ .abinary。我发现了什么:
.dlls和.as.so和静态链接到.a。.lib而关于SO的另一个问题则表明它不起作用。不幸的是,我在MinGW和MinGW-w64上找不到明确的文档来说明在动态/静态链接库时正确与错误的地方。
根据我的经验,我一直能够动态链接到.dll。一次,我能够静态链接到.lib(使用-static标志)。
题:
是.dll/ .a与MinGW的-W64 GCC工具链编译的二进制文件时拨出动,静链接库?换句话说,为MSVC生成的动态库和为GCC生成的静态库?