开发者
资源
鲲鹏环境下基于openEuler 20.03 LTS编译sigar-lib-1.6.4.jar过程参考
鲲鹏环境下基于openEuler 20.03 LTS编译sigar-lib-1.6.4.jar过程参考
发表于2024/02/29
4051

1、扫描依赖包

当我们不知道java项目是否包含native依赖的时候,可以使用DevKit代码迁移工具扫描整个war或者jar包。

鲲鹏DevKit代码迁移工具获取链接:https://www.hikunpeng.com/developer/devkit/porting-advisor

通过鲲鹏DevKit代码迁移工具,扫描sigar-lib-1.6.4.jar结果如下:

2、分析扫描结果

sigar-lib-1.6.4.jar包调用了native的动态库libsigar-x86-linux.so,且该动态库未在已有的白名单里,故不能通过工具直接下载,需要手动编译。

3、编译libsigar-aarch64-linux.so

1)安装依赖

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

2)下载源码并解压

#下载
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

cke_66081.png

执行ant编译:

ant

4、编译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

cke_72212.png

5、FAQ

1)[cc] gcc: 错误:unrecognized command line option ‘-m64’

问题截图

cke_85904.png

问题描述:鲲鹏平台不支持-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

问题截图:

cke_91048.png

问题描述:进入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/

cke_94623.png

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

cke_98487.png

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞