动态库执行时链接

时间:2010-05-27 05:37:41

标签: c++ winapi

为什么在编译时无法在链接加载库?我不关心释放图书馆,但它不起作用。

#include <windows.h>

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

试试这段代码。它应该可以解决你的问题。

#include <windows.h>

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

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

答案 2 :(得分:2)

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

如果您确实想在运行时加载DLL,则必须使用GetProcAddress。有关正确使用LoadLibrary的完整示例代码,请参见MSDN page

答案 3 :(得分:1)

您正在尝试使用LoadLibrary函数加载.lib文件(链接器库信息),该函数用于加载动态链接库 - 这是完全错误的。 .lib文件在链接时链接在可执行文件中,而.dll文件在运行时加载,可以通过使用LoadLibrary显式加载,也可以通过向链接器提供引用.dll文件的.lib文件。

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