如何在没有lib文件的情况下将dll引用到Visual Studio [英] How to reference a dll to Visual Studio without lib file

查看:375
本文介绍了如何在没有lib文件的情况下将dll引用到Visual Studio的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I needed to add a third party library to my project, and they only supply a .dll file (no .lib)

我已将dll添加到了转到项目属性页面的公共属性->引用->添加新引用

I have added the dll to the project by going to the project Property Page under Common Properties -> References -> Add New Reference

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

I can see the dll under the External Dependencies folder in the Solution Explorer, so I guess it was included correctly.

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

But how do I reference the dll? When I try to add an instance variable (For example, MCC::iPort::ASCII iPort) to access the dll class, I get Error: name followed by '::' must be a class or namespace name, but I know thats the class name I can see it in the dll info under External Dependencies.

推荐答案

访问a的唯一方法没有.lib文件的裸DLL是使用 LoadLibrary() ,获取指向要使用 GetProcAddress() ,然后将这些指针转换为正确的函数签名。如果该库导出了C ++函数,则您将不得不传递给 GetProcAddress()的名称。您可以使用 dumpbin / exports your.dll列出导出的名称。

The only way to access a bare DLL without a .lib file is to load the DLL explicitly with LoadLibrary(), get pointers to the exported functions you want to access with GetProcAddress(), and then cast those pointers to the proper function signature. If the library exports C++ functions, the names you have to pass to GetProcAddress() will be mangled. You can list the exported names with 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 获取导出函数的列表:

As has been noted by others, a LIB file can be created. Get the list of exported functions from dumpbin /exports your.dll:

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

将名称放入DEF文件:

Put the names into a DEF file:

EXPORTS
adler32
adler32_combine
compress
(etc.)

现在制作LIB文件:

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

对于名称经过修饰的情况,可以使用C ++名称修饰或32位 stdcall 调用约定,只需复制并粘贴报告的任何名称 dumpbin ,修改和全部。

For cases where the name has been decorated, either by C++ name mangling or 32-bit stdcall calling convention, simply copy and paste whatever names dumpbin reported, mangling and all.

这篇关于如何在没有lib文件的情况下将dll引用到Visual Studio的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆