2010-05-27 85 views
2

为什么在编译时链接库加载失败?我不在乎释放图书馆,但它不会工作。动态库在执行时链接

#include <windows.h> 

    int main() 
    { 
     LoadLibrary("winmm.lib"); 
     timeGetTime(); 
    } 
+0

“不起作用”不是对问题非常有帮助的描述。请解释*什么*没有工作,你尝试过什么,以及显示哪些错误消息(如果有的话)。 – greyfade 2010-05-27 05:54:36

+0

我得到一个错误,说“错误LNK2019:无法解析的外部符号__imp__timeGetTime @ 0在函数_main中引用” – 2010-05-27 06:08:05

+0

错误消息不会告诉你LoadLibrary是造成这个问题,因此你的问题是不适合atm。 – YeenFei 2010-05-27 07:02:44

回答

3

.lib不是动态链接库(DLL),并且不能在运行时加载。您需要加载.dll,或在链接时链接.lib(此时您不使用LoadLibrary)。

+0

我试过'LoadLibrary(“winmm.dll”);'但它不会工作。 – 2010-05-27 05:44:52

2

从上面的注释可以看出,问题在于timeGetTime()在编译时需要winmm模块,这意味着您必须链接到winmm.lib。如果要使用运行时链接,则不能直接通过其名称调用该函数;你必须从DLL中取出它的函数指针。

如果您真的想在运行时加载DLL,则必须使用GetProcAddress。在MSDN page上找到了一套正确使用LoadLibrary的示例代码。

3

试试看看这个代码。它应该解决你的问题。

#include <windows.h> 

#pragma comment(lib, "winmm.lib") 

int main() 
{ 
    DWORD time = timeGetTime(); 
} 
+0

虽然它不是“便携式”,但我喜欢将链接信息和编译信息紧密结合在一起的想法。 – xtofl 2010-05-27 06:49:40

1

你要加载使用LoadLibrary功能,其目的是加载动态链接库一的.lib文件(链接库信息) - 这是完全错误的。 .lib文件在链接时链接到可执行文件中,而.dll文件在运行时加载,可以通过使用LoadLibrary的显式加载或通过向链接器提供引用.dll文件的.lib文件。

  • 如果你想加载一个静态库,你需要告诉链接器包含它 - 请参考你的编译器的文档。
  • 要使用.lib文件加载动态库,您需要执行与静态库相同的操作,并将动态库置于全局PATH或与可执行文件相同的目录中。
  • 要在运行时加载动态库,您需要调用LoadLibrary以获取它的句柄并将其传递给GetProcAddress以获取指向您感兴趣的函数的指针。Wikipedia has a small example on how to do this