如何列出从.so文件导出的符号?如果可能的话,我也想知道它们的来源(例如,如果它们是从静态库中引入的).
我正在使用gcc 4.0.2,如果这有所不同.
使用模块定义文件(MyDLL.def)创建基本C++ DLL和导出的名称.编译后我检查导出的函数名称,dumpbin.exe
我希望看到:
SomeFunction
Run Code Online (Sandbox Code Playgroud)
但我看到了这一点:
SomeFunction = SomeFunction@@@23mangledstuff#@@@@
Run Code Online (Sandbox Code Playgroud)
为什么?
导出的函数显示为未修饰(特别是与不使用Module Def文件相比),但其他内容是什么?
如果我使用dumpbin.exe来自任何商业应用程序的DLL,你会得到干净的:
SomeFunction
Run Code Online (Sandbox Code Playgroud)
没有别的......
我还尝试删除模块定义并使用"C"导出方式导出名称,即:
extern "C" void __declspec(dllexport) SomeFunction();
Run Code Online (Sandbox Code Playgroud)
(简单地使用"extern"C"没有创建导出函数)
但是,这仍然会产生相同的输出,即:
SomeFunction = SomeFunction@@@23mangledstuff#@@@@
Run Code Online (Sandbox Code Playgroud)
我也尝试了这个#define dllexport __declspec(dllexport)选项并创建了一个没有问题的LIB.但是,我不想在他们的C#应用程序中向使用DLL的人提供LIB文件.
它是一个普通的C++ DLL(非托管代码),用C++编译,只是一个简单的头和代码.没有Module Def我得到了错误的导出函数(我可以创建一个静态库并使用LIB没问题.我试图避免这种情况).如果我使用extern "C" __declspec(dllexport) OR模块定义我得到的似乎是一个未修饰的函数名...唯一的问题是它后跟一个"=",看起来像是函数的装饰版本.我想摆脱"="之后的东西 - 或者至少理解它为什么存在.
既然这样,我敢肯定,我可以使用P调用从C#中的函数/调用...我只是想避免垃圾在"="号结束.
我对如何更改项目/编译器设置的建议持开放态度,但我只使用了标准的Visual Studio DLL模板 - 没什么特别的.