注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C++小知识64——动态库中函数导出的问题再分析  

2015-09-14 17:43:05|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
C++小知识64——动态库中函数导出的问题再分析
在前面讲了很多的库的调用方法和错误的解决方式,但是没有从宏观上对其做一个控制,今天又遇到了这样一个基础性的问题,看了一下就没深究,结果掉到了坑儿里。
很简单,在C++的工程中调用一个C编译的库时,发现总是在链接时undefined reference to 'xxxxx',这种问题轻车熟路,直接用nm命令查看了一下库,结果发现还真有这个函数导出,无语,仔细的看了看Eclipse的调用库的设置都对。真是没办法了。
后来同事增加了一个extern "C",发现就可以调用了。突然也明白了原因,这种现象太坑人啊。所以简单总结一下,以咨后用。
1、C程序调用C库,OK,什么都不用处理。
2、C++程序调用C++库,OK,什么都不用处理。
3、C程序调用C++库,这个大家的警惕性都非常高,所以一般不会出问题,因为在使用nm之类的查看时(包括WIN下用DEPENDS),名字都是改过了,所以会直接使用extern "C"(或者Def文件等)直接来处理。
4、C++程序调用C库,上面的就是这个现象,按套路出牌,看了导出函数,都没有变,但是C++在包含了库提供的头文件后,会去改名字,仍然是找不到。所以虽然在SO中有这个函数名,但仍然是报链接的错误。
其实最近在写NDK时就发现JNI程序中对接口的封包:

#ifdef __cplusplus
extern "C"{
#endif
void Test();
#ifdef __cplusplus
}
#endif
注意不要写错了宏。
当然你也可以在应用程序包含的头文件中这样做:
#ifdef __cplusplus
extern "C"{
#endif
#include "xxx.h"
#include "xxx.h"
#ifdef __cplusplus
}
#endif
同样,你也可以直接操作某个函数,这个在前面都说过N多次了,这里就不再赘述。
更多的资料大家可参看:
http://blog.chinaunix.net/uid-26000296-id-3778646.html
http://developer.51cto.com/art/201002/182133.htm
http://blog.chinaunix.net/uid-26000296-id-3778505.html
http://www.cnblogs.com/kenkofox/archive/2009/11/05/1597053.html
  评论这张
 
阅读(217)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017