动态库在执行时链接
为什么在编译时链接库加载失败?我不在乎释放图书馆,但它不会工作。动态库在执行时链接
#include <windows.h>
int main()
{
LoadLibrary("winmm.lib");
timeGetTime();
}
.lib
不是动态链接库(DLL),并且不能在运行时加载。您需要加载.dll
,或在链接时链接.lib
(此时您不使用LoadLibrary)。
我试过'LoadLibrary(“winmm.dll”);'但它不会工作。 – 2010-05-27 05:44:52
从上面的注释可以看出,问题在于timeGetTime()在编译时需要winmm模块,这意味着您必须链接到winmm.lib。如果要使用运行时链接,则不能直接通过其名称调用该函数;你必须从DLL中取出它的函数指针。
如果您真的想在运行时加载DLL,则必须使用GetProcAddress。在MSDN page上找到了一套正确使用LoadLibrary的示例代码。
试试看看这个代码。它应该解决你的问题。
#include <windows.h>
#pragma comment(lib, "winmm.lib")
int main()
{
DWORD time = timeGetTime();
}
虽然它不是“便携式”,但我喜欢将链接信息和编译信息紧密结合在一起的想法。 – xtofl 2010-05-27 06:49:40
你要加载使用LoadLibrary功能,其目的是加载动态链接库一的.lib文件(链接库信息) - 这是完全错误的。 .lib文件在链接时链接到可执行文件中,而.dll文件在运行时加载,可以通过使用LoadLibrary的显式加载或通过向链接器提供引用.dll文件的.lib文件。
- 如果你想加载一个静态库,你需要告诉链接器包含它 - 请参考你的编译器的文档。
- 要使用.lib文件加载动态库,您需要执行与静态库相同的操作,并将动态库置于全局PATH或与可执行文件相同的目录中。
- 要在运行时加载动态库,您需要调用LoadLibrary以获取它的句柄并将其传递给GetProcAddress以获取指向您感兴趣的函数的指针。Wikipedia has a small example on how to do this。
“不起作用”不是对问题非常有帮助的描述。请解释*什么*没有工作,你尝试过什么,以及显示哪些错误消息(如果有的话)。 – greyfade 2010-05-27 05:54:36
我得到一个错误,说“错误LNK2019:无法解析的外部符号__imp__timeGetTime @ 0在函数_main中引用” – 2010-05-27 06:08:05
错误消息不会告诉你LoadLibrary是造成这个问题,因此你的问题是不适合atm。 – YeenFei 2010-05-27 07:02:44