我刚刚下载了curl
并设法用它构建了一个程序。
我不明白为什么它需要curllib.lib
和curllib.dll
?
在我看来,curllib.lib
或curllib.dll
应该足够了,为什么两者兼而有之?
此外,我搜索了源代码,但未找到使用dlopen
加载curllib.dll
的任何地方,那么为什么curllib.dll
需要运行?
答案 0 :(得分:3)
curllib.lib
是导入库。它包含实际代码在DLL中的所有函数的存根,它包含加载DLL的代码。 .lib
由构建系统(例如Visual Studio)自动生成,这就是您在代码中找不到任何引用的原因。但是,您会发现一些指令告诉编译器/链接器导出某些函数:
__declspec(dllexport)
将导出该函数。这很方便,但特定于Microsoft。例如:
void __declspec(dllexport) foobar(int qux);
或者,可以使用.def
文件,该文件明确列出导出的所有函数。例如:
LIBRARY MYFOO
EXPORTS
foobar @1
如果你真的想要,你可以不用.lib
,但你必须手动使用LoadLibrary
,GetProcAddress
和朋友来调用DLL中的函数。
答案 1 :(得分:1)
运行.dll
是必需的。 .lib
存在,因此链接器可以从函数名称解析序数和地址,并且仅在链接时需要。
其他系统(如Linux)在共享库中维护完整的链接信息,不需要这样做。
答案 2 :(得分:0)
在Windows上使用DLL时,通常将其与.lib
文件一起使用,该文件告诉链接器足以创建可执行文件。然后,可执行文件在运行时使用.dll
文件。
OTOH,dlopen
是一种UNIX / Linux / POSIX类型的东西 - 在Windows上的等价物是LoadLibrary
。您通常会将dlopen
与.so
文件一起使用。