我知道有一个名为Dll to lib的工具,但开发人员要求1000美元。 我只需要转换一个库一次,所以不容易证明这个价格。
我尝试了IMPLIB32.EXE,但我只是获取了空的.lib文件。 我怎么能做到这一点? 也许我可以写一个简单的转换应用程序?
Added1:
Dll通常是stdcall而不是cdecl,用旧的C语言编写,而不是C#或.NET或C ++。我现在需要从C ++应用程序中调用它们。一个例子是SQLite.dll或zlib.dll。 我无法访问这些dll的.lib文件。
Added2:
我为VS2008重新编写了这段代码 http://floodyberry.wordpress.com/2008/09/08/generating-dll-wrappers/ 并包含示例Dll等可下载到这里: http://www.transferbigfiles.com/Get.aspx?id=7d86fa0b-6ddc-4f6f-8d31-2c20824aae9a 这反过来又创建了一个创建Dll的项目。当我尝试编译Dll时,我得到链接器错误: AddShow.dll:致命错误LNK1107:文件无效或损坏:无法读取0x300 这里描述: http://list.isis.vanderbilt.edu/pipermail/udm-users/2006-March/000664.html 不知道如何继续。到目前为止如此接近
接下来我们转到这个方法
http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/
使用参数/ export C:\ path \运行dumpbin到\ AddShow.dll 绝对没有 经过一番研究
http://msdn.microsoft.com/en-us/library/aa446532.aspx 似乎需要从common / ide文件夹中使用mspdb71.dll(现在是mspdb80.dll) dumpbin.exe现在运行时出错:
致命错误LNK1106:文件无效或磁盘已满:无法寻找0x6179A 这些线程表明dumpbin.exe的版本可能是问题
我有Microsoft(R)COFF / PE Dumper版本9.00.30729.01
所以我试过了 Microsoft(R)COFF二进制文件转储器版本5.12.8078 没有成功。 经过多次阅读后我不再接近了
http://support.microsoft.com/kb/815645 http://support.microsoft.com/kb/839286 http://markmail.org/message/p5vwzyfyv3bs6z34 http://fixunix.com/programmer/94825-fatal-error-lnk1106-invalid-file-disk-full.html
当我运行ProcMon时,我看到当svchost.exe尝试打开它时,第一次出现queryopen和sqlite3.dll,并且错误路径未找到。路径是C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ bin \ SQLITE3.DLL并且是正确的。如果我把它放在C盘的根部,那么我得到NAME NOT FOUND错误:
C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ bin \ link.exe.Local
C:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ bin \ dumpbin.exe.Local
分别来自link.exe和dumpbin.exe。我使用XPSP3而不是Vista,这是我对sysinternals的限制。什么是这些.local文件?
(csrss.exe也无法找到一些清单文件。)
所以没有成功,只是更神秘
新增3:
我尝试从其安装位置\ Program Files \ Microsoft Visual Studio 8 \ VC \ bin运行dumpbin.exe,但操作系统说它无法找到mspdb80.dll。我从\ Program Files \ Microsoft Visual Studio 8 \ Common7 \ IDE复制了mspdb80.dll,试图让dumpbin.exe运行。
现在我收到错误: “c1902程序数据库管理器不匹配请检查您的安装”
如果我从\ Program Files \ Microsoft Visual Studio 8 \ VC \ bin中删除mspdb80.dll,则错误消失!但是我无法运行dumpbin.exe。
新增4:
我终于可以通过将以下文件复制到文件夹来运行dumpbin:
DUMPBIN.EXE LINK.EXE LIB.EXE mspdb80.dll
我确实收到了错误:
致命错误LNK1248:图像大小(FFFFFXXX)超出最大允许大小 (80000000)
一次,但更换dll修复了那个。据推测它已经腐败了?
然后我转到说明中的下一步: http://www.coderetard.com/2009/01/21/generate-a-lib-from-a-dll-with-visual-studio/ http://support.microsoft.com/kb/131313 并得到错误: 忽略目标平台不支持的警告lnk4017语句 原来是因为我指定了.dll而不是.def文件。
然后将生成的.Lib和.exp文件添加到VS2008项目中并编译并运行。然后调试器报告错误: 运行时检查失败#0 - ESP的值未在函数调用中正确保存...
如上所述 "Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call" after successful C# callback from the C++ code of GameSpy lib 这是因为我在我的dll中使用了stdcall并在我的app中声明了__cdecl。
extern "C" { // put Dll C function prototypes here
int __cdecl AddTwoNum(int n, double f); // __stdcall
}
所以将此更改为__stdcall应该修复它你会想到的......但是不行。
现在我收到一个链接错误: 错误LNK2001:未解析的外部符号_AddTwoNum @ 12
由于某种原因,这是一个装饰的函数名称。为什么呢?
添加了n:
原来这是因为.lib文件是使用带有STDCALL函数的dll创建的。 STDCALL要求调用者清理堆栈,以便使用@符号将参数的字节数附加到函数名称。在这种情况下,我有三个4Byte iintegers,总共12个字节。
一旦我从使用CDECL调用约定创建的dll重新创建.lib文件,那么一切都很好。
答案 0 :(得分:6)
我似乎无法对他的回答发表评论(我需要更多声望?),但您可以尝试使用我的.dll wrapper generator创建存根.dll建议。
答案 1 :(得分:5)
我假设您想在C / C ++中调用dll中的某些函数/方法,而无需访问lib文件来链接它。
如果您知道所需功能的签名,您可以:
答案 2 :(得分:4)
您还可以使用LoadLibrary()和GetProcAddress()动态进行。
(参见第二个链接的例子)。
答案 3 :(得分:1)
在像zlib或sqlite这样的情况下,您可以直接下载源代码并编译自己的lib文件。事实上,我刚刚为zlib做了这个,我从www.zlib.net(direct zlib 1.2.3 download)下载了源代码,打开了提供的visual studio项目文件并编译了lib的调试和发布版本。我没有尝试过sqlite,但看到他们有源,这应该不难做到。
如果它是专有的dll,您可以尝试向原始开发人员或公司索取lib文件,或编写您自己建议的存根dll或者使用RaphaelSP的动态路径。
如果它们是用C导出的(没有C ++名称修改)我会自己去动态路线。
答案 4 :(得分:1)
答案 5 :(得分:0)
This应该是一个免费的工具,可以进行转换。我不确定它是否像“限量试用版”一样“免费”,信息不是很清楚。如果您已经对此进行了测试,请编辑您的问题,我将删除此答案。
答案 6 :(得分:0)
如果您联系Dll to lib工具的开发人员,他们可能愿意给您折扣。
之前我曾经遇到过这种情况(我需要一次昂贵的工具),有时候我获得了很大的折扣。
尝试它永远不会伤害。
祝你好运。答案 7 :(得分:0)
我已成功使用http://wyw.dcweb.cn/dllfaq.htm中的详细信息从DLL获取lib。您的里程可能有所不同我用它来从python DLL获取一个lib来构建一些用'C'编写的python扩展。
答案 8 :(得分:0)
开源edll有自己的内部COFF加载器。 edll是为了完全不同的目的编写的,但由于它内部有独立的COFF加载器,也许可以将.dll合并到.exe中的二进制流或资源中,然后在运行时使用edll的COFF加载器加载内置的dll