当前位置: 首页 > backend >正文

华为仓颉语言如何进行交叉编译

目录

引言

Linux主机如何编译产生Windows可执行文件

Windows部署执行可执行文件

分发运行时库

中文乱码问题

CMD窗口下解决方案

PowerShell解决方案

修改系统配置的解决方案

在程序中指定代码页的解决方案

Windows主机交叉编译Linux可执行文件存在的问题

结语


引言

交叉编译能让开发者在一个平台上生成适用于其他平台的可执行文件或库。这在跨平台应用开发、适配不同硬件架构设备时极为重要,比如在一个平台下完成程序的开发,就可利用交叉编译快速完成其他平台的适配。这个问题在华为仓颉的文档中没有提到,它主要是介绍本机开发,接下来,就为分享一些我用华为仓颉语言交叉编译的相关内容。

Linux主机如何编译产生Windows可执行文件

我在华为云提供的免费开发者云主机上安装了仓颉的SDK。华为云主机是x86_64架构的,操作系统使用的是Ubuntu。

先编写了一个简单的 “Hello World” 仓颉程序,存放在名为 “hello_world” 的目录下,源文件为 “hello.cj”。

// hello.cj
main() {println("你好,仓颉")
}

通过在终端进入该目录,执行编译命令 “cjc hello.cj” ,编译完成后,会生成如 main(在 Linux 环境下)这样的可执行文件,以及 default.cjo 和 default.bchir2 等相关文件 。

我们现在想在Linux环境下编译产生Windows的可执行文件main.exe,就需要在命令行加上--target选项。

cjc hello.cj --target x86_64-unknown-windows-gnu

这样就可以得到Windows可执行程序了。 

Windows部署执行可执行文件

分发运行时库

在前面的博文华为仓颉语言生成的程序的分发部署-CSDN博客已经介绍了,要分发程序需要包括运行时库,Windows下需要libcangjie-runtime.dll和libsecurec.dll。这两个库文件在仓颉的Linux SDK中包括了。事实上,不单是这两个文件,仓颉的Linux SDK中包括了全部Windows所需要的运行库,在cangjie\runtime\lib\windows_x86_64_llvm目录下可以找到。看来官方是考虑到Linux用户有交叉编译需求的。

中文乱码问题

现在在Windows上执行代码会出现乱码的问题:

出现这个问题的原因是我们的代码使用的UTF-8字符集。要解决这个问题有下面几个办法。

CMD窗口下解决方案

如果使用的是CMD窗口,在窗口下执行如下语句:

chcp 65001

这个命令的意思是临时修改编码页面为UTF-8。使用这个命令之后显示就正常了。

PowerShell解决方案

如果是PowerShell,使用上面CHCP无效。需要使用下面的命令:

$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding

使用后显示中文正常。 

修改系统配置的解决方案

以上两个方法都只对当前窗口有效,如果想永久有效,可以修改系统配置,具体做法参考:【仓颉】控制台输出中文乱码,cmd和powershell的解决方案_仓颉控制输出乱码怎么办-CSDN博客

在程序中指定代码页的解决方案

也可以参考项目首页 - CangJie-Troubleshooting:常见问题解决办法 - GitCode的做法,在程序中加上对代码页的修改:

foreign func SetConsoleOutputCP(wCodePageID: UInt32): Boolmain(): Int64 {unsafe { SetConsoleOutputCP(65001) }println("你好,仓颉")return 0
}

Windows主机交叉编译Linux可执行文件存在的问题

不建议在Windows主机上编译Linux可执行文件,因为麻烦很多。

首先是缺少modules\linux_x86_64_llvm文件:

PS D:\Software\Cangjie\cangjie\bin> ./cjc --target=x86_64-unknown-linux-gnu .\hello.cj
error: failed to detect cangjie modules, reason: target library path is not exist : D:\Software\Cangjie\cangjie\bin\..\modules\linux_x86_64_llvm
1 error generated, 1 error printed.

这个目录可以从Linux SDK中找到。但是接下来还会遇到如下问题:

PS D:\Software\Cangjie\cangjie\bin> ./cjc --target=x86_64-unknown-linux-gnu .\hello.cj
error: not found `x86_64-linux-gnu-ar.exe` in search paths. You may add search path by `-B` option.

仓颉SDK实际上只提供了前端,它需要Windows下的Linux交叉编译工具链才能工作,由于嫌麻烦就放弃了。有兴趣的朋友可以继续探索。

结语

 今天分享了一些仓颉语言交叉编译的体会。由于刚刚上手仓颉语言,很多地方还不熟悉,欢迎朋友们批评指正。

http://www.xdnf.cn/news/8260.html

相关文章:

  • 第三十二天打卡
  • 构建基于全面业务数据的大数据与大模型企业护城河战略
  • 【Linux】网络基础3
  • JUC入门(五)
  • 进程、线程和协程切换的比喻
  • 【分治】归并排序:递归版 非递归版
  • IDC机房交换机紧急更换的流程和注意事项
  • torch.gather()和torch.sort
  • 火语言UI组件--控件函数调用
  • 免费开源的图片分割小工具
  • RT-Thread源码阅读(1)——基本框架
  • 通过云服务器实现异地组网 部署WireGuard
  • 【机器学习】 关于外插修正随机梯度方法的数值实验
  • 听脑AI:革新沟通方式,开启高效信息时代
  • 核实发票的真实性与合法性-发票查验接口-虚假发票防范
  • 关于Newtonsoft版本不兼容问题处理
  • sentinel滑动时间窗口算法详解
  • 系统性能分析基本概念(3) : Tuning Efforts
  • imuerrset
  • PT8P2104触控型8Bit MCU
  • 【Django Serializer】一篇文章详解 Django 序列化器
  • deep-rtsp 摄像头rtsp配置工具
  • 高频与超高频RFID读写器技术应用差异解析
  • 论文解读: 2018-Detection of spam reviews: a sentiment analysis approach
  • 宝尊电商一季度净收入21亿元 品牌管理收入同比大增
  • 冲刺卷软考总结-案例分析
  • 地信GIS专业关于学习、考研、就业方面的一些问题答疑
  • Windows系统下Docker安装青龙面板
  • 常见高危端口解析:网络安全中的“危险入口”
  • 101个α因子#15