如何在没有lib文件的情况下将dll引用到Visual Studio [英] How to reference a dll to Visual Studio without lib file
问题描述
我需要在项目中添加第三方库,并且它们仅提供一个.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屋!