【问题标题】:Linking DLL with Visual C++用 Visual C++ 链接 DLL
【发布时间】:2012-06-25 08:32:47
【问题描述】:

我正在尝试在 Visual C++ 2010 中使用外部 DLL(由 AutoItX 提供)。AutoItX 提供了一个 DLL,但由于某种原因不是 LIB,所以我使用 Visual Studio 生成了一个。

问题是链接器似乎无法链接到库。我在 Properties->Linker -> Inputs 下添加了 AutoItX3.lib 作为附加依赖项,并将目录添加到 Properties -> Linker -> General -> Additional Library Directories。不管我做什么,我仍然得到这些错误:

1>main.obj : error LNK2019: unresolved external symbol _AU3_Send@8 referenced in function _WinMain@16
1>main.obj : error LNK2019: unresolved external symbol _AU3_WinWaitActive@12 referenced in function _WinMain@16
1>main.obj : error LNK2019: unresolved external symbol _AU3_Run@12 referenced in function _WinMain@16
1>main.obj : error LNK2019: unresolved external symbol _AU3_Sleep@4 referenced in function _WinMain@16

AU3_Send、AU3_WinWaitActive、AU3_Run 和 AU3_Sleep 是程序 main.cpp 调用的函数。我真的没有想法,因为这些函数显然存在于 DLL 中。任何帮助将不胜感激。

【问题讨论】:

    标签: c++ visual-c++ dynamic-linking autoit


    【解决方案1】:

    仅提供 DLL 作为接口是很常见的。许多软件提供商都这样做。这样做会产生以下影响(后果):

    • 客户端应用程序只能动态链接到提供的库(因此得名动态链接库)。提供者(库)和消费者(应用程序或任何其他库)之间的绑定是动态进行的。
    • 客户端必须使用 LoadLibray 和 GetProcAddress 才能绑定库并检索所需的符号(函数)
    • 图书馆和消费者之间的接口(合同)应通过头文件记录 - 例如参见 AutoIt3.h -(或任何其他文档,如帮助文件,..)
    • 未提供 LIB(因为不需要),因为链接发生在运行时,而不是编译器/链接器时

    要解决您的问题,您只需删除您在 Visual Studio 配置中放置的静态依赖项(LIB),并在运行时使用 LoadLibrary 和 GetProcAddress 设置依赖项

    【讨论】:

    • 谢谢。那么有没有办法避免LoadLibrary 和GetProcAddress 呢?为什么在带有MinGW的Eclipse中,我可以直接链接到DLL,并直接调用它们的函数?
    • 没有别的办法。实际上有些人直接访问PEB(en.wikipedia.org/wiki/Process_Environment_Block),但这比较困难。我不使用 Eclipse,但我想它有一个围绕 LoadLibrary 和 GetProcAddress 的包装器,并使绑定看起来更流畅。
    猜你喜欢
    • 2010-10-20
    • 2011-12-12
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多