我有一个供应商提供的C ++ .lib文件,有一些稀疏的文档和示例代码。我的任务是使用它来构建原型来展示供应商的技术。
作为一个(大多数)C#/ Java开发人员,我正在尝试使用这个库并使用我知道的技巧来破解基本的东西 - 所有这些都让我相信我错过了某些东西(或者lib是...)
dumpbin / exports foo.bin不显示任何导出的函数:
E:\SDKs\Acme\lib>dumpbin /exports foo.lib
Microsoft (R) COFF/PE Dumper Version 10.00.40219.01
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file foo.lib
File Type: LIBRARY
Summary
1AB29A0 .bss
6BD0 .data
AAE0 .nocopy
C5A0E0 .noinit
1954D0 .rdata
19000 .scratch
C1CA0 .text
492000 .vram
lib / list foo.lib显示了一个数字,我假设是具有.w32o扩展名的函数名。根据功能名称和供应商所处的业务类型,这些都看起来有效。
供应商的README表示通过调用__foo_entry()函数来启动库。 Dumpbin / SYMBOLS确实显示了这个功能:
040 00002826 SECT1 notype () External | __foo_entry
供应商的示例代码加载库(使用dlopen,这是根据my understanding加载库的* nix方式。)
但是我已经创建了一个VS2010项目,并尝试加载这样的库:
System::Void load(){
HINSTANCE sdl_library = LoadLibrary(TEXT("E:\\SDKs\\Acme\\lib\\foo.lib"));
if (sdl_library == NULL) {
Console::WriteLine("error");
} else {
Console::WriteLine("success");
}
}
当项目尝试包含“LoadLibrary”的行时,调试器会抛出错误图像异常:“E:\ SDKs \ Acme \ lib \ foo.lib”要么不是设计为在Windows上运行,要么包含错误......“
依赖walker在这里帮助不大,因为.lib是静态的。
那么:它是否是有效的.lib?
visual studio命令行工具似乎表明它是有效的,但是尝试将其加载到项目中表明它不是。
答案 0 :(得分:2)
在Windows上,共享库和LoadLibrary
与文件扩展名.dll
相关联。
.lib
建议您尝试静态链接,例如linux .a
文件。 .lib
文件可能包含实际代码,但也用于导入库,这样静态链接将生成在运行时需要DLL的二进制文件。