在centos7.6和openEuler20.03环境下进行sigar-lib.jar编译
新人帖
测试环境:centos7.6和openEuler20.03
-
扫描依赖包
当我们不知道java项目是否包含native依赖的时候,可以使用工具扫描整个war或者jar包。
鲲鹏代码迁移工具:https://www.hikunpeng.com/developer/devkit/porting-advisor
以下是扫描结果:

-
分析扫描结果
sigar-lib-1.6.4.jar包调用了native的动态库libsigar-x86-linux.so,且该动态库未在已有的白名单里,故不能通过工具直接下载,需要手动编译。
-
编译libsigar-aarch64-linux.so
-
安装依赖
yum install -y wget gcc gcc-c++ make cmake libtool autoconf automake ant unzip java-1.8.0-openjdk java-1.8.0-openjdk-devel maven
-
下载源码并解压
#下载
wget https://github.com/hyperic/sigar/archive/refs/tags/sigar-1.6.4.tar.gz
#解压
tar zxvf sigar-1.6.4.tar.gz
3.编译
#进入工程目录
cd sigar-sigar-1.6.4/bindings/java/
#修改ArchNameTask.java 79行-m64为-mabi=lp64
vi ./hyperic_jni/src/org/hyperic/jni/ArchNameTask.java

#在openEuler操作系统中,需在linux_sigar.c文件中引入头文件sys/sysmacros.h
cd ../../src/os/linux/linux_sigar.c



-
编译sigar-lib-1.6.4.jar
#下载
wget https://github.com/gridkit/sigar-lib/archive/sigar-lib-1.6.4.tar.gz
#解压
tar zxvf sigar-lib-1.6.4.tar.gz
#进入工程目录
cd sigar-lib-sigar-lib-1.6.4/
#拷贝libsigar-aarch64-linux.so
cp /root/dev/sigar-sigar-1.6.4/bindings/java/sigar-bin/lib/libsigar-aarch64-linux.so .
#编译
mvn package

-
FAQ
(1)[cc] gcc: 错误:unrecognized command line option ‘-m64’
问题截图:

问题描述:鲲鹏平台不支持-m64编译选项
解决思路:将鲲鹏平台对应的编译选项设置为-mabi=lp64

(2)/root/dev/sigar-sigar-1.6.4/src/os/linux/linux_sigar.c:1148:22: 错误:called object ‘major’ is not a function or function pointer
问题截图:

问题描述:
进入sigar-sigar-1.6.4/src/os/linux/linux_sigar.c,查看1148和1149行代码,major和minor函数未找到,可能缺少头文件。
1148 #define ST_MAJOR(sb) major((sb).st_rdev)
1149 #define ST_MINOR(sb) minor((sb).st_rdev)
解决思路:
在系统头文件路径下搜索关键字major和minor,查看头文件名。
grep -r "major(" /usr/include/
grep -r "minor(" /usr/include/

将文件sigar-sigar-1.6.4/src/os/linux/linux_sigar.c中,引入头文件sys/sysmacros.h

测试环境:centos7.6和openEuler20.03
扫描依赖包
当我们不知道java项目是否包含native依赖的时候,可以使用工具扫描整个war或者jar包。
鲲鹏代码迁移工具:https://www.hikunpeng.com/developer/devkit/porting-advisor
以下是扫描结果:
分析扫描结果
sigar-lib-1.6.4.jar包调用了native的动态库libsigar-x86-linux.so,且该动态库未在已有的白名单里,故不能通过工具直接下载,需要手动编译。
编译libsigar-aarch64-linux.so
安装依赖
yum install -y wget gcc gcc-c++ make cmake libtool autoconf automake ant unzip java-1.8.0-openjdk java-1.8.0-openjdk-devel maven
下载源码并解压
#下载
wget https://github.com/hyperic/sigar/archive/refs/tags/sigar-1.6.4.tar.gz
#解压
tar zxvf sigar-1.6.4.tar.gz
3.编译
#进入工程目录
cd sigar-sigar-1.6.4/bindings/java/
#修改ArchNameTask.java 79行-m64为-mabi=lp64
vi ./hyperic_jni/src/org/hyperic/jni/ArchNameTask.java
#在openEuler操作系统中,需在linux_sigar.c文件中引入头文件sys/sysmacros.h
cd ../../src/os/linux/linux_sigar.c
编译sigar-lib-1.6.4.jar
#下载
wget https://github.com/gridkit/sigar-lib/archive/sigar-lib-1.6.4.tar.gz
#解压
tar zxvf sigar-lib-1.6.4.tar.gz
#进入工程目录
cd sigar-lib-sigar-lib-1.6.4/
#拷贝libsigar-aarch64-linux.so
cp /root/dev/sigar-sigar-1.6.4/bindings/java/sigar-bin/lib/libsigar-aarch64-linux.so .
#编译
mvn package
FAQ
(1)[cc] gcc: 错误:unrecognized command line option ‘-m64’
问题截图:
问题描述:鲲鹏平台不支持-m64编译选项
解决思路:将鲲鹏平台对应的编译选项设置为-mabi=lp64
(2)/root/dev/sigar-sigar-1.6.4/src/os/linux/linux_sigar.c:1148:22: 错误:called object ‘major’ is not a function or function pointer
问题截图:
问题描述:
进入sigar-sigar-1.6.4/src/os/linux/linux_sigar.c,查看1148和1149行代码,major和minor函数未找到,可能缺少头文件。
1148 #define ST_MAJOR(sb) major((sb).st_rdev)
1149 #define ST_MINOR(sb) minor((sb).st_rdev)
解决思路:
在系统头文件路径下搜索关键字major和minor,查看头文件名。
grep -r "major(" /usr/include/
grep -r "minor(" /usr/include/
将文件sigar-sigar-1.6.4/src/os/linux/linux_sigar.c中,引入头文件sys/sysmacros.h