如何在没有库文件的情况下将dll引用到Visual Studio
How to reference a dll to Visual Studio without lib file
我需要添加一个第三方库到我的项目中,他们只提供一个。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/
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 加载与引用 .NET DLL 位于同一文件夹中的引用的 .NET DLL 时"Not found"异常
- 解析引用 |exe/dll vs lib
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- 如何在 c# 代码中通过引用调用时从 c++ dll 更新数组值?
- C++ DLL 引用C++.exe中的函数和类
- 64 位进程中的 AnyCPU C# DLL 无法引用 64 位C++ DLL(给出错误:无法加载文件或程序集)
- 引用另一个文件夹中的.dll
- 当使用CreateObject从VBScript引用DLL时C++如何处理DLL版本?
- .NET CORE 2 DLL引用带有C 代码运行时错误
- DLL 引用之间的区别?和用途?
- std::lock_guard是否递增dll引用计数器?(LoadCount)
- 插件 DLL 引用的 DLL 的搜索路径
- 非托管C++-需要强名称才能被具有强名称的C++/CLI dll引用
- 未找到DLL:引用依赖DLL
- 如何在没有库文件的情况下将dll引用到Visual Studio
- 用户定义的dll引用另一个用户定义的dll时发生链接器错误
- 将dll引用到应用程序后编译错误