最近与ISV合作,将其地铁综合监控应用从x86 Linux迁移到K1 Power Linux平台,中间遇到的问题记录如下,供各位参考。
迁移环境: K1 Power S922 + Redhat 7.6 ppc64le
原因:
通过查看 mysqld 日志,发现启动的不是 5.7.34 ,而是 MariaDB 5.5 ,原来是Redhat 7.5 安装时,已经安装上了系统自带的 MariaDB 5.5 ,它的优先级似乎高于 5.7.34
解决方法:
把系统自带的 MariaDB 5.5 删除,重新启动 mysqld
原因:
这是因为 at 12.0 自带的gcc编译器是 8.4版本,遵循 C++11 规范,对于语法检查比较严格。而应用代码开发的比较早,在当时的编译器是 gcc 4.7
解决方法:
参考
https://blog.csdn.net/nh5431313/article/details/78753597
https://lixiaogang5.blog.csdn.net/article/details/94435105?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-6.essearch_pc_relevant&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-6.essearch_pc_relevant
可以在编译选项中指定使用标准为 c++98 ,或者更改代码,增加空格
C++11要求,当字符串跟变量连接的时候,必须增加一个空格才行。因此解决方案有2个:
(1) Makefile文件明确告知编译方式采用C++98:CFLAGS += -std=c++98
(2) 增加空格
原因:
没有安装 alsa-lib-devel
解决方法:
安装 alsa-lib-devel
https://buildlogs.centos.org/c7.1810.00.ppc64le/alsa-lib/20181030170600/1.1.6-2.el7.ppc64le/
https://mirrors.tuna.tsinghua.edu.cn/centos-altarch/7.9.2009/os/power9/Packages/
原因:
声明的代码段如下
此代码段是为 HP-Unix 解决字节序问题所加,针对unix操作系统大端的特殊处理。而现在是在 Linux操作系统。并且猜测 gcc 4.7 在这一块检查并不严格或者有bug,导致用 gcc 4.7 编译并不报错。
解决方法:
在 gcc 8.4 编译时增加宏定义
原因:
strcat 的参数会导致未定义的行为
参考:
https://stackoverflow.com/questions/53584293/cannot-access-memory-at-address
strcat(s,(char*)(intptr_t)year); invokes Undefined Behavior. year is not a nul-terminated string which likely causes strcat to go screaming off across your function stack looking for the first nul-byte which is equally likely well beyond the bound of s.
解决方法:
字符串一定以 \0 结尾
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞0
添加新评论0 条评论