动态库引入函数的问题

来源:互联网 发布:截面数据来源 编辑:程序博客网 时间:2024/05/22 04:54

动态库引入函数的问题,在做程序时做了一个动态库,在动态库中导出了一个 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 的实现,则会出现
函数重复定义的错误