C++如何判断static.lib是否有效,是否可从外部代码调用

C++ how to tell if static .lib is valid, callable from external code

本文关键字:是否 有效 从外部 调用 代码 lib static 何判断 判断 C++      更新时间:2023-10-16

我有一个由供应商提供的C++.lib文件,其中包含一些稀疏的文档和示例代码。我的任务是用它来构建一个原型来展示供应商的技术。

作为一名(主要)C#/Java开发人员,我正试图使用这个库和我所知道的技巧来破解一些基本的东西——所有这些都让我相信我错过了一些东西(或者这个库是…)

dumpbin/exports-foo.bin不显示任何导出的函数:

E:SDKsAcmelib>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/listfoo.lib显示了一个数字,我认为它是扩展名为.w32o的函数名。根据函数名称和供应商所处的业务类型,这些看起来都是有效的。

供应商的README表示通过调用其__foo_entry()函数来启动库。垃圾箱/SYMBOLS实际上显示了这个功能:

040 00002826 SECT1  notype ()    External     | __foo_entry

供应商的示例代码加载库(使用dlopen,根据我的理解,这是加载库的一种*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"的行时,调试器抛出一个Bad Image异常:"E:\SDKs\Acme\lib\foo.lib"不是为在Windows上运行而设计的,或者它包含一个错误。。。">

依赖助行器在这里没有多大帮助,因为.lib是静态的。

那么:它是否是一个有效的.lib?

visualstudio命令行工具似乎表明它是有效的,但试图将它加载到项目中表明它不是。

在Windows上,共享库和LoadLibrary与文件扩展名.dll相关联。

.lib建议您应该尝试静态链接,比如linux.a文件。.lib文件可能包含实际代码,但也用于导入库,因此静态链接将在运行时生成需要DLL的二进制文件。