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

时间:2014-02-11 00:02:05

标签: c++ static-libraries

我有一个供应商提供的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命令行工具似乎表明它是有效的,但是尝试将其加载到项目中表明它不是。

1 个答案:

答案 0 :(得分:2)

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

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