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

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

目录

引言

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交叉编译工具链才能工作,由于嫌麻烦就放弃了。有兴趣的朋友可以继续探索。

结语

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

相关文章:

  • Java微服务架构:Spring Cloud全栈指南,附最新Demo源码,可独立运行!
  • v3.0 YOLO篇-如何通过YOLO进行实验
  • 2024游戏安全白皮书:对抗激烈!PC游戏外挂功能数增长超149%,超85%移动外挂为定制挂(附获取方式)
  • 怎样通过神经网络估计股票走向
  • 华为RH1288HV3 BMC忘记用户名密码如何恢复默认
  • 【QT】QT6设置.exe文件图标
  • 华为云Flexus+DeepSeek征文 | 基于ModelArts Studio 的 DeepSeek API 实现行业深度搜索和分析
  • 云南安全员考试报名需要具备哪些条件?
  • 汇川EasyPLC MODBUS-RTU通信配置和编程实现
  • 力扣热题——罗马数字转整数
  • MySQL 查询用户权限的方法
  • 在WSL2中运行nvidia-smi时出现命令未找到的问题
  • vue2和vue3的区别
  • 如何更好地做出判断?
  • Prometheus的服务命令和配置文件
  • springboot03
  • Linux(Ubuntu)新建文件权限继承问题
  • 常见算法题目1 - 给定一个整数数组和一个目标值,找出数组中两个数之和等于目标值的数组下标组合
  • 【424. 替换后的最长重复字符】
  • linux字符模式关闭光标
  • 高校两学一做专题网站/网络推广员要怎么做
  • 新华书店的做的数字阅读网站/一般开车用什么导航最好
  • 杭州网站设计公司哪家好/纯注册app拉新平台
  • 环球贸易网站/seo站点
  • 南昌网站开发培训班/百度总部地址
  • 专业的网站建设设计价格/seo提供服务