【问题标题】:How to reference a dll to Visual Studio without lib file如何在没有 lib 文件的情况下将 dll 引用到 Visual Studio
【发布时间】:2015-07-29 18:53:26
【问题描述】:

我需要在我的项目中添加一个第三方库,他们只提供一个 .dll 文件(没有 .lib)

我已通过转到 Common Properties -> References -> Add New Reference 下的项目属性页,将 dll 添加到项目中

我可以在解决方案资源管理器的 External Dependencies 文件夹下看到 dll,所以我猜它包含正确。

但是我如何引用 dll 呢? 当我尝试添加实例变量(例如,MCC::iPort::ASCII iPort)来访问 dll 类时,我得到错误:名称后跟 '::' must be a class or namespace name,但我知道那是我可以在外部依赖项下的 dll 信息中看到它的类名。

【问题讨论】:

  • 你不能在 c+± 中,没有头文件和实现绑定存根的 .lib 文件,对于 .dll

标签: c++ dll visual-studio-2013


【解决方案1】:

在没有 .lib 文件的情况下访问裸 DLL 的唯一方法是使用 LoadLibrary() 显式加载 DLL,使用 GetProcAddress() 获取指向要访问的导出函数的指针,然后将这些指针转换为正确的函数签名。如果库导出 C++ 函数,您必须传递给 GetProcAddress() 的名称将被破坏。您可以使用dumpbin /exports your.dll 列出导出的名称。

extern "C" {
    typedef int (*the_func_ptr)( int param1, float param2 );
}

int main()
{
    auto hdl = LoadLibraryA( "SomeLibrary.dll" );
    if (hdl)
    {
        auto the_func = reinterpret_cast< the_func_ptr >( GetProcAddress( hdl, "the_func" ) );
        if (the_func)
            printf( "%d\n", the_func( 17, 43.7f ) );
        else
            printf( "no function\n" );

        FreeLibrary( hdl );
    }
    else
        printf( "no library\n" );

    return 0;
}

正如其他人所指出的,可以创建一个 LIB 文件。从dumpbin /exports your.dll获取导出函数列表:

ordinal hint RVA      name
      1    0 00001000 adler32
      2    1 00001350 adler32_combine
      3    2 00001510 compress
(etc.)

将名称放入 DEF 文件中:

EXPORTS
adler32
adler32_combine
compress
(etc.)

现在制作 LIB 文件:

lib /def:your.def /OUT:your.lib

对于名称已通过 C++ 名称修改或 32 位 stdcall 调用约定进行修饰的情况,只需复制并粘贴 dumpbin 报告的任何名称、修改等。

【讨论】:

  • 可以从DLL创建导入库,gcc甚至可以直接链接dll
  • @Artyom,如果 dumpbin 输出像 _NWET@16 = _NWET@16 这样的名称,但在 .h 文件中是函数的名称怎么办是NWET吗?在这种情况下,我们在 .def 文件中写什么?提前谢谢你
  • 对于 32 位 stdcall 函数,在导出的函数名称中添加下划线前缀和参数堆栈使用后缀。所以,你应该把_NWET@16放在def文件中。
【解决方案2】:

【讨论】:

  • 也有(或曾经有)IMPLIB
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 2021-06-07
  • 1970-01-01
相关资源
最近更新 更多