相关疑难解决方法(0)

1511
推荐指数
11
解决办法
72万
查看次数

如何在.so文件中列出符号

如何列出从.so文件导出的符号?如果可能的话,我也想知道它们的来源(例如,如果它们是从静态库中引入的).

我正在使用gcc 4.0.2,如果这有所不同.

c c++ gcc symbols name-mangling

444
推荐指数
10
解决办法
34万
查看次数

C++ DLL Export:装饰/ Mangled名称

使用模块定义文件(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模板 - 没什么特别的.

c++ dll export name-decoration

26
推荐指数
7
解决办法
5万
查看次数

标签 统计

c++ ×3

c ×2

name-mangling ×2

dll ×1

export ×1

extern-c ×1

gcc ×1

linkage ×1

name-decoration ×1

symbols ×1