gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:23:36 24 4
gpt4 key购买 nike

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

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

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

但是我如何引用 dll 呢?当我尝试添加一个实例变量(例如,MCC::iPort::ASCII iPort)来访问 dll 类时,我得到错误:名称后跟 '::' must be a class or namespace name,但我知道那是我可以在外部依赖项下的 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( "%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 报告的任何名称、修饰和全部。

关于c++ - 如何在没有 lib 文件的情况下将 dll 引用到 Visual Studio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31708832/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com