跨平台编译C代码问题之ARM平台char类型导致异常及其解决措施

news2024/9/29 3:34:09

目录

环境设备:

背景现象:

1、x86下的结果输出和打印输出

2、arm下的结果输出和打印输出

原因分析:

解决措施:


环境设备:

        x86的ubuntu、arm的麒麟

背景现象:

        由于项目需要,需要将代码移植到arm服务器上去,在arm上执行程序提供服务。为此,将x86上的代码放在arm上编译成动态库,加载运行后发现执行的结果与x86本机上运行的结果相比有很大的差异。

        相同代码执行结果如下:

1、x86下的结果输出和打印输出

规避区面元数量 m_iNumOfPolygonEvade = 1

10  ,1052649656 , 18 个

规避区面元数量 m_iNumOfPolygonEvade = 1

8  ,1052649656 , 16 个

--1979-- id=710000152

--1979-- id=710000598

规避区面元数量 m_iNumOfPolygonEvade = 1

1021  ,1052649656 , 1585 个

--1979-- id=710009417

--1979-- id=710031541

--1979-- id=710032913

--1979-- id=710034854

--1979-- id=710035658

--1979-- id=710043323

--1979-- id=710058884

--1979-- id=710058889

--1979-- id=710058899

--1979-- id=710058900

--1979-- id=710058904

--1979-- id=710060218

--1979-- id=710060227

--1979-- id=710100072

--1979-- id=710101186

2、arm下的结果输出和打印输出

规避区面元数量 m_iNumOfPolygonEvade = 1

10  ,-960636016 , 18 个

--1979-- id=710000035

--1979-- id=710000043

--1979-- id=710000044

--1979-- id=710000141

--1979-- id=710000158

--1979-- id=710000187

规避区面元数量 m_iNumOfPolygonEvade = 1

8  ,-960636016 , 16 个

--1979-- id=710000135

--1979-- id=710000152

--1979-- id=710000572

--1979-- id=710000596

--1979-- id=710000598

--1979-- id=710000829

--1979-- id=710000830

--1979-- id=710000932

--1979-- id=710000986

--1979-- id=710001168

--1979-- id=710001170

--1979-- id=710001171

--1979-- id=710001172

--1979-- id=710001173

--1979-- id=710001174

--1979-- id=710002033

规避区面元数量 m_iNumOfPolygonEvade = 1

1021  ,-960636016 , 1585 个

以下的--1979-- id=710000156太多了,这里省略。

原因分析:

       根据上面打印可以发现,每次获取的基本数据是一样的,问题就是id保留的不一样,此处是判断点是否在面上的函数过滤出来的id号。为此重点查看该函数,算法逻辑没问题,发现函数里面采用char类型来定义的。再检索发现也有很多人遇到过ARM平台char类型导致异常的问题。

       char变量在不同CPU架构下默认符号不一致,在x86架构下为signed char,在ARM64平台为unsigned char,移植时需要指定char变量为signed char。

       参考ARM下char类型符号问题_强制指定char带符号_huojianying123456的博客-CSDN博客进行测试,可以根据打印充分验证上述原因的正确性。

       另外参考:解决编译-fsigned-char问题-云社区-华为云 (huaweicloud.com)给出具体的解决措施。

解决措施:

        直接指定arm系统的char变量(这样建议在docker中操作,方便编译和使用)

1.使用command -v gcc命令寻找gcc所在路径(一般位于/usr/bin/gcc)

2.更改gcc的名字(比如改成gcc-impl)

3.在gcc所在目录执行vim gcc,并填入如下内容保存:

#! /bin/sh

/usr/bin/gcc-impl    -fsigned-char "$@"

4.执行chmod +x gcc给脚本添加执行权限

5.使用与1-4步相似的方法修改g++

最后,直接编译生成库执行程序即可得到与x86上相同的结果了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1025818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux编辑器-gcc的使用

一:背景知识 1.预处理(头文件展开、去注释、宏替换、条件编译) 2.编译(由C生成汇编) 3.汇编(生成及其可识别代码) 4.连接(生成可执行文件或库文件) 二:gcc…

解决ModuleNotFoundError: No module named ‘diffusers.models.cross_attention‘

目录 项目场景: 问题描述 原因分析: 解决方案: 方案一:

如何取消显示Notepad++每行显示的CRLF符号

新电脑中重新安装了Nodepad,打开记事本后发现出现了许多黑底的CR|LF标记,特别碍眼。 如何取消呢? 视图 -> 显示符号 -> 取消勾选 显示行尾符操作步骤 预期效果

秦丝9周年 | 各行业实体生意如何实现数字化转型?

近期,北京、深圳、天津、重庆等全国27个省都在推进“一刻钟便民生活圈”——以社区居民为服务对象,在步行15分钟左右的范围内,满足居民日常生活基本消费和品质消费。 而各行业的实体店是这个“圈”中的重要组成部分,很多入驻的实…

jupyter notebook进不去指定目录怎么办?

首先激活你要使用的虚拟环境 刚开始是现在 (base) C:\Users\lenovo>目录下 直接输入你想进入的盘 (base) C:\Users\lenovo>e:此时再cd (base) C:\Users\lenovo>cd E:\tim\learn_pytorch 就可以进入了 安装3.4.1.15问题 已经有了最新python版本的虚拟环境&#…

6-1 汉诺塔

汉诺(Hanoi)塔问题是一个经典的递归问题。 设有A、B、C三个塔座;开始时,在塔座A上有若干个圆盘,这些圆盘自下而上,由大到小地叠在一起。要求将塔座A上的圆盘移到塔座B上,并仍按同样顺序叠放。在…

微服务是个坏主意吗?

曾几何时,我记得我的手指疯狂地敲打键盘,与庞大而杂乱的代码库搏斗。那是巨石的时代,代码就像古老的城堡一样,由一块块石头砌成一个令人印象深刻的庞然大物。 几年过去了,时代变了。开发人员口中的流行语变成了“微服…

TS同时打包和监视所有ts文件或只指定ts文件

当我们项目中ts文件较多时,我们如何直接打包所有ts文件为js文件?而不是使用tsc 文件名 一个一个去打包文件 一、配置tsconfig.json文件 创建一个tsconfig.json文件,该文件中不需要配置任何信息 二、控制台输入打包命令 在控制台输入如下代…

手机机型响应式设置2

window.screen.height:屏幕高度 window.innerHeight:视口高度(去除浏览器头尾的高度) document.body.clientHeight:内容高度 vh:网页视口高度的1/100 vw:网页视口宽度的1/100 vmax&#xff…

2万多条汉字笔画笔顺查询ACCESS\EXCEL数据库

发现很多新华字典类的数据都没有笔顺的相关数据,因此就找了一下笔顺查询相关,发现有两个模式,一种是每个字每个笔画都有一张图片(很庞大的图片数据量);一种是笔画图片文件显示型,比如今天采集的…

Vue的详细教程--基础语法【下】

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Vue的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.事件处理器 ①.stop ②.prevent ③.on…

消费盲返模式:一种让消费者和商家都受益的新型消费返利模式

消费盲返是一种新型的消费返利模式,它的核心思想是:消费者在平台购买商品后,可以获得后续一定数量的订单的部分利润作为奖励。这样,消费者不仅可以享受商品的优惠,还有可能赚取更多的钱。 这种模式对于平台和消费者都有…

WorkPlus | 好用、专业、安全的局域网即时通讯及协同办公平台

自国家于2022年发布的《关于加强数字政府建设的指导意见》以来,我国数字政府建设已经迈入了一个全新的里程碑,迎来了全面改革和深化升级的全新阶段。 WorkPlus作为自主可控、可信安全、专属定制的数字化平台,扮演着政务机关、政府单位以及各…

mysql 导入sql文件

mysql 导入sql文件 sudo mysql -uroot -p123456 -h127.0.0.1 sudo mysql -uroot -p123456 -h127.0.0.1然后 show databases;然后 use 数据库名称; 然后 source 20230920031001.sql;如果不加 -h127.0.0.1 可能会出现错误 /var/lib/mysql.sock error 通过 navicat导入的话&am…

英语——分享篇——每日100词——201-300

chess——che车(拼音)ss两个美女(编码)——车里有两个美女在下国际象棋 April——ap阿婆(拼音)ri日(拼音)l棍子(编码)——四月份阿婆每日拿着棍子 palace——place地方——这个地方是宫殿 bottle——bo60(象形)ttle太太乐(拼音)——有60颗太太乐鸡精在瓶子里

VVICAPI接口解析,实现根据ID取商品详情

VVICAPI是一个虚构的API接口名称,我无法提供具体的VVICAPI接口解析。但是,我可以向您展示一般的API接口使用方法,以及如何根据ID获取商品详情的示例代码。 假设您有一个名为"VVICAPI"的接口,并且您已经获得了访问该接口…

epoll的并发服务器(TCP服务器与客户端通信)

服务器&#xff1a; #include<myhead.h> #define IP "192.168.250.100" #define PORT 8888 /* typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64; } epoll_data_t;struct epoll_event {uint32_t events; …

使用vmware安装虚拟机时“出现此主机支持Intel VT-x,但Intel VT-x处于禁用状态”。

1、出现问题 使用vmware安装虚拟机时“出现此主机支持Intel VT-x&#xff0c;但Intel VT-x处于禁用状态”。 已将该虚拟机配置为使用 64 位客户机操作系统。但是&#xff0c;无法执行 64 位操作。 此主机支持 Intel VT-x&#xff0c;但 Intel VT-x 处于禁用状态。 如果已在 BI…

JPA的注解@Field指定为Keyword失败,导致查询不到数据

一、背景 使用 jpa 对es操作&#xff0c;查询条件不生效&#xff0c;需求是批量查询课程编号。说白了&#xff0c;就是一个In集合的查询。在es里&#xff0c;如果是精准匹配是termQuery&#xff0c;比如&#xff1a; queryBuilder.filter(QueryBuilders.termQuery(“schoolId…

【Vue】路由与Node.js下载安装及环境配置教程

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Vue快速入门》。&#x1f3af;&#x1f3af; &…