首页
社区
课程
招聘
[讨论]VC静态库中的__stdcall函数名如何让它没有_前缀及@后缀
发表于: 2008-12-5 23:06 7229

[讨论]VC静态库中的__stdcall函数名如何让它没有_前缀及@后缀

2008-12-5 23:06
7229
编译VC静态库,如果我定义某个函数func()如下:
extern  "C"  int  __stdcall  func(int a, int b)
{
   return a+b;
}
则VC编译出来的函数名为:
_func@8
我希望这个函数名象C++Builder那样很干净,即变成纯粹的:
func
没有任何前缀及后缀。
请问在VC中有没有什么办法做到这一点?
我知道如果是编译动态库的话,可以通过定义一个.def文件来做到
引出的函数名是干净的,但是我现在要求在静态库中做到这一点。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 139
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
You CAN'T.

It's the compiler, or be more accurate it's the linker, that does the job and it's typically called "name binding", to ensure that the name is unique across the whole program when generating the executable file. Go google on the details.
2008-12-6 08:27
0
雪    币: 223
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
两种方法,一种是重命名,另一种是用def
2008-12-6 09:21
0
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
4
没有啊,BCC里面也是一样的。
2008-12-6 11:23
0
雪    币: 39
活跃值: (2901)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
请问具体怎么做?编译成静态库也可以用.def吗?
2008-12-6 11:40
0
雪    币: 39
活跃值: (2901)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
BCC编译出来的函数名确实是干净的,没有@后缀,也没有_前缀。
我用IDA反编译过。
2008-12-6 11:41
0
雪    币: 39
活跃值: (2901)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
I have googled many times and failed in finding the resolution.
I hate that kind of "name binding".
If I really could not find how to fix the problem,  I may resort to
fixing CL.exe itself.
2008-12-6 11:47
0
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
8
那就太奇怪了,我是用ultraedit打开来看的。
可能是IDA自己做了解析吧
2008-12-6 16:44
0
雪    币: 39
活跃值: (2901)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我后来用16进制工具打开.lib看过,函数名func确实是没有前缀及后缀的,
可能你用的编译器与我的不一样,我用的是Borland C++ Builder5;
在另外一台装有C++Builder6的机器上试了一下,结果也是一样。
2008-12-6 17:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
标准调用约定的命名规范就这样的
你用bcc是什么?bcb吧?

bcb有可能是Pascal调用约定,Pascal的话命名规范确实是像你说的那样

具体的你可以看加密与解密这本书里,有介绍
2008-12-7 14:17
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
stdcall 都有 @ 符号
cdecl 没有

....

__stdcall 修饰的主要目的以便连接器检查调用者和被调用者参数个数是否匹配,那么在c代码使用stdcall调用,连接器就可以帮你检查到错误(比如你的声明函数和库不一致)、像c++为了实现函数类型检查、函数重载使用了更多的修饰。。。
2008-12-7 14:32
0
游客
登录 | 注册 方可回帖
返回
//