动态库引入函数的问题
2010-12-08 21:01
260 查看
动态库引入函数的问题,在做程序时做了一个动态库,在动态库中导出了一个 Add 函数,在自己的测试程序中用LoadLibrary,GetProAddress 方法想得到 Add 函数的地址以调用,LoadLibrary能返回句柄,但 GetProAddress(hMod, "Add")返回 0,为什么呢?
经过调查发现,是因为动态库是用 C++ 的方式实现的,也就是说是在 CPP 文件中实现的(我们现在项目的代码大部分是用 C 实现的),那么用 depends 查看动态库的函数名时,Add被加上了前缀与后缀,形成如 "?Add@AXZY"的形式,那么 GetProAddress(hMod, "?Add@AXZY") 就可以正确载入了,也就是说 depends 看到的函数名是什么,就用 GetProAddress 使用什么函数名,怎么解决有前缀与后缀的问题呢,也就是在把 C++ 的函数以 C 的形式导出呢,在动态库头文件的声明中加上
extern "C" 就可以了如下:
#ifdef __cplusplus
extern "C"
{
#endif
int Add(int, int);
#ifdef __cplusplus
}
#endif
这样 depends 中显示的就是 Add 了,当然如果用 .h 与 .lib 配合调用的方式,则不加 extern "C" 也可以
另外要注意的是在用 .h 与 .lib 配合调用动态库时,如果动态库中已有函数 Add,而自己的测试程序中还有 Add 的实现,则会出现
函数重复定义的错误
经过调查发现,是因为动态库是用 C++ 的方式实现的,也就是说是在 CPP 文件中实现的(我们现在项目的代码大部分是用 C 实现的),那么用 depends 查看动态库的函数名时,Add被加上了前缀与后缀,形成如 "?Add@AXZY"的形式,那么 GetProAddress(hMod, "?Add@AXZY") 就可以正确载入了,也就是说 depends 看到的函数名是什么,就用 GetProAddress 使用什么函数名,怎么解决有前缀与后缀的问题呢,也就是在把 C++ 的函数以 C 的形式导出呢,在动态库头文件的声明中加上
extern "C" 就可以了如下:
#ifdef __cplusplus
extern "C"
{
#endif
int Add(int, int);
#ifdef __cplusplus
}
#endif
这样 depends 中显示的就是 Add 了,当然如果用 .h 与 .lib 配合调用的方式,则不加 extern "C" 也可以
另外要注意的是在用 .h 与 .lib 配合调用动态库时,如果动态库中已有函数 Add,而自己的测试程序中还有 Add 的实现,则会出现
函数重复定义的错误
相关文章推荐
- vue 的 函数引入 index 问题
- 【问题】c/c++函数内部动态分配的内存,函数执行完毕会释放吗?
- 动态加载dll的导出函数的问题
- 二维数组动态申请空间以及二维数组函数传参问题
- 在动态THML语句中调用JS函数传递带空格参数的问题
- 关于动态引入js时的顺序问题
- C 语言两个动态库函数重名问题
- 函数的返回值问题(返回指针和数组的区别)静态存储区、动态数据区、栈
- 动态连接库中的函数,解释后出现问题,求救!!!
- 关于jsp的静态和动态引入文件问题
- js循环动态绑定带参数函数遇到的问题及解决方案[转]
- 动态引入的外部 JS 文件在各浏览器中的加载顺序不一致问题解决
- C++命名空间中操作符函数的动态链接问题
- JNI java 调c++动态库函数,多值回传及乱码问题
- [原创]java WEB学习笔记104:Spring学习---AOP 前奏,通过一个问题引入动态代理
- 动态加载DLL实现不同DLL的相同导出函数调用问题
- python中关于小数点后面的数四舍五入问题解决的几个函数供大家参考,现在问题是如何动态输入小数点后多少位,比如12.3000这样的
- c/c++函数间动态内存传递问题