华为仓颉语言如何进行交叉编译
目录
引言
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交叉编译工具链才能工作,由于嫌麻烦就放弃了。有兴趣的朋友可以继续探索。
结语
今天分享了一些仓颉语言交叉编译的体会。由于刚刚上手仓颉语言,很多地方还不熟悉,欢迎朋友们批评指正。