gpt4 book ai didi

c - MS lib.exe 是否支持 DLL 符号重定向,例如 dlltool 中的 '=='

转载 作者:行者123 更新时间:2023-11-30 17:51:27 28 4
gpt4 key购买 nike

例如如果我有一个导出符号 __ugly_name 的 libtest.dll 文件,我想在源文件和 lib 文件中使用 Pretty_name,我可以这样做

    D:\var\tmp\build>type t-dll.c

main() { pretty_name(); }

D:\var\tmp\build>type libtest.def

EXPORTS
pretty_name == __ugly_name

D:\var\tmp\build>dlltool -k -m i386 --input-def libtest.def --dllname libtest.dll --output-lib libtest.dll.a

D:\var\tmp\build>gcc -o t-dll.exe t-dll.c -L. -ltest

The result t-dll.exe reference symbol '__ugly_name' in libtest.dll file.
VERY GOOD !

But for MS lib.exe, 'pretty_name=__ugly_name' does not do the trick:

D:\var\tmp\build>type libtest.def

EXPORTS
pretty_name=__ugly_name

D:\var\tmp\build>cl /nologo /MD /Fet-dll-vc.exe t-dll.c libtest.lib

t-dll-vc.exe still reference non-exist symbol 'pretty_name' in libtest.dll file.

可悲的是。 MS lib.exe 支持 DLL 符号重定向吗?谢谢。

最佳答案

看起来你的“丑陋”名字被装饰为一个 stdcall 函数,它有一个双下划线前缀和一个 @nn 后缀,其中 nn 是函数调用使用的堆栈字节数。您只需在 .def 文件中声明未修饰的名称即可重命名它们。因此,如果您的代码当前生成 __MyApiFunc@4,请创建一个 .def 文件,如下所示,并使用 link.exe -lib 选项或使用 -link 标志后的编译器将其包含为 cl .. .c_flags... -link -dll -lib:myapi.def ...linkflags...

LIBRARY yourlibname
EXPORTS
MyApiFunc

基本上,您不需要等于来导出未修饰的名称。您需要对大多数 DLL 执行此操作,因为通常的 Windows 约定是具有未修饰名称的 stdcall 函数。一旦有了这样的 DLL,您就可以从 Visual Basic 和 .Net 中使用,就像使用普通 Windows 操作系统提供的 DLL 一样。 (假设你确实有 stdcall 函数)。

关于c - MS lib.exe 是否支持 DLL 符号重定向,例如 dlltool 中的 '==',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16728467/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com