如何在没有lib文件的情况下将dll引用到Visual Studio

时间:2015-07-29 18:53:26

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

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

我已经通过转到Common Properties下的项目Property Page - >将dll添加到项目中。参考文献 - >添加新参考

我可以在解决方案资源管理器中看到外部依赖项文件夹下的dll,所以我猜它已被正确包含。<​​/ p>

但是如何引用dll呢? 当我尝试添加一个实例变量(例如,MCC :: iPort :: ASCII iPort)来访问dll类时,我得到Error:name后跟&#39; ::&#39;必须是类或命名空间名称,但我知道我可以在外部依赖项下的dll信息中看到它的类名。

2 个答案:

答案 0 :(得分:29)

在没有.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报告,修改和所有名称。

答案 1 :(得分:6)

如果您没有.lib文件,可以从.dll创建一个文件:

https://adrianhenke.wordpress.com/2008/12/05/create-lib-file-from-dll/

希望有所帮助。