extern "c" 动态链接库符号表导出问题 以及函数参数压栈顺序
来源:互联网 发布:surfacepro mac 对比 编辑:程序博客网 时间:2024/05/21 17:29
c语言编译的动态链接库中,导出的符号名字就是 源代码中的相应的名字;
例如函数 void test(){} 导出的符号名字 就是 test
但是对于c++ 来讲不是这样, c++ 有类, 名字空间, 函数重载, 导致多个不同的对象可能使用一个相同的名字, 这样必须由编译器来生成全局的唯一名字;
这种生成的方式 没有标准化, 所以 window上的vc 编译器可能生成一种名字, linux上的gcc 可能生成一种名字, mingw 可能也会生成一种名字;
因此不同编译器生成的C++动态库, 从符号名字上来讲,不兼容。
但是如果需要从C++库导出某些名字 使得大家都认识该怎么做呢?
源代码中写下:
extern "c"{
void test();
}
将会生成 标准的c符号名字, 也就是 test, 这样所有人都会认识这个符号了!
当然要注意一点 所有声明该符号的位置 不能出现在名字空间中, 否则 仍旧生成 C++类型的符号名字。
标准c中定义了函数的参数的压栈和出栈相关问题: 压栈从右向左压入参数;而当函数返回的时候, 由调用者负责清理堆栈, 弹出 相应的参数
也就是被调用者 直接return, 调用者再清理 堆栈顶部指针, 这样实现printf 函数就比较方便了(可变长度参数, 被调用者不用关心参数的数量)
但是win32中, 有一种windows专用的stdcall方法, 参数也是从右向左压入, 但是 函数返回的时候是由被调用者清理堆栈
也就是被调用者先拿到返回地址, 在设置堆栈顶部指针, 最后返回(被调用者需要关心参数的数量)
这些是windows 需要的东西:
因此在写win32程序的时候 如果需要 采用标准的 c参数处理方式, 就需要显示的告诉 编译器;
__cdecl 标准c的参数管理方式 __stdcall windows的参数管理方式
主要用于dll说明参数的管理方式的:
__declspec(dllexport)用于导出 该动态库 的标准c方式的函数
__declspec(dllimport) 用于一个动态库 依赖于 另一个动态库的函数
- extern "c" 动态链接库符号表导出问题 以及函数参数压栈顺序
- 链接器符号解析算法小解以及静态库链接顺序等等问题
- 动态链接库导出模板类以及一些问题
- 【C/C++】静态链接库、动态链接库、extern "C"
- 动态链接库DLL导出函数名字改编问题
- Linux动态链接(5)动态库符号搜索顺序
- C语言函数调用时参数压栈的顺序以及函数指针的作用
- C函数动态参数问题
- 关于C函数参数压栈顺序
- 动态链接库导出函数的若干问题
- linux动态链接库导出函数控制
- 控制linux动态链接库导出函数
- linux动态链接库导出函数
- linux动态链接库导出函数控制
- 动态链接库DLL的函数导出
- 动态链接库导出函数示例
- linux动态链接库导出函数控制
- 动态链接库中导出模板函数
- VB.NET轻松学会处理时间技巧(一)
- oracle常用命令
- 想自己在php里记录网站的访问统计
- 跨服务器复制数据库表
- 怎么样设置环境变量,取消前后的空格。
- extern "c" 动态链接库符号表导出问题 以及函数参数压栈顺序
- Android中Paint字体属性的设置
- 在linux下设置开机自动启动程序的方法
- js p web 中文乱码
- sixth sense之iphone开发环境搭建
- 用户,权限,角色
- SVNKit使用冲突解决方案
- Android系统之事件处理子系统启动过程的学习和分析
- oracle表管理