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

How to reference a dll to Visual Studio without lib file

本文关键字:dll 引用 Studio Visual 情况下 文件      更新时间:2023-10-16

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

我已经添加了dll到项目通过转到项目属性页下的公共属性->参考->添加新的参考

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

但是我如何引用dll?当我尝试添加实例变量(例如,MCC::iPort::ASCII iPort)访问dll类时,我得到错误:名称后面跟着'::'必须是类或命名空间名称,但我知道这是类名,我可以在外部依赖项下的dll信息中看到它。

访问没有.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( "%dn", the_func( 17, 43.7f ) );
        else
            printf( "no functionn" );
        FreeLibrary( hdl );
    }
    else
        printf( "no libraryn" );
    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++名称mangling或32位stdcall调用约定对名称进行了修饰的情况,只需复制并粘贴dumpbin报告的名称,mangling和所有名称。

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

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