Sigar是一个对系统运行相关参数获取的库,支持C++、java、python等10几种语言调用。常见的Sigar使用均是通过java进行调用,sigar.jar已经对sigar进行了非常好的封装,所以只要理解了参数意思,使用上不会太大的问题。目前我在做一个C++分布式系统中,需要对系统参数上报到zookeeper中,于是采用sigar进行封装,我这里对sigar c api进行了C++类的封装。在使用一些format的工具函数过程中,发现sigar_format.h中的函数无法链接的问题,一直以为这些工具函数需要引入sigar_format.c文件进行编译,但是引入源码文件又引入一些如sigar_private.h等头文件,这些文件从名称来看是内部的一些声明,外部无需引入,而且在编译过程中仍然有很多问题。

于是,用文本编辑器打开sigar-x86-winnt.lib文件,搜索发现里面不仅包含了JNI调用的方法,还包含了sigar_format中的各种函数原生方法,发现问题不在于sigar_format不存在,而是链接器无法找到对应的方法。记得以前对extern "C" 测试过程中,发现c和c++编译器,编译后的目标文件,同样的函数方法名称会改变,因此如果c++调用c头文件时,需要在头文件中定义extern "C"。

即在.h文件定义

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif

最终解决问题。问题比较诡异,但如果理解C++和C编译相关问题,针对这些问题便迎刃而解。

Sigar C API 使用中sigar_format.h中函数无法链接lib的问题
Tagged on:     

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据