Golang支持龙芯架构,LoongArch64编译配置教程
IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Golang支持龙芯架构,LoongArch64交叉编译配置指南》,聊聊,我们一起来看看吧!
支持LoongArch64架构的Go开发环境需配置正确的交叉编译工具链和Go版本。1. 确保使用Go 1.20或更高版本,因从1.19开始初步支持LoongArch64,但稳定支持始于1.20;2. 安装LoongArch64交叉编译工具链,可通过包管理器安装gcc-loongarch64-linux-gnu和g++-loongarch64-linux-gnu,或手动获取预编译包并配置PATH;3. 设置环境变量CGO_ENABLED=1、GOOS=linux、GOARCH=loong64、CC=loongarch64-linux-gnu-gcc进行交叉编译;4. 常见问题包括编译器路径错误、链接失败、Go版本不兼容及运行时报错,应检查PATH、CC变量、静态链接设置、目标系统依赖及内核版本,并通过简单程序逐步测试定位问题。
支持LoongArch64架构的Go开发环境,核心在于配置正确的交叉编译工具链和Go语言本身的特定版本。简单来说,你需要一个足够新的Go版本(建议Go 1.20或更高),以及一套能针对LoongArch64生成代码的C/C++交叉编译器。这听起来可能有点绕,但实际操作起来,只要思路清晰,并非难事。

解决方案
要让你的Go开发环境能够顺利地为龙芯LoongArch64架构编译程序,最直接的路径是:
确保Go版本支持: Go语言从1.19版本开始初步支持LoongArch64,但真正稳定且推荐使用的是Go 1.20及以上版本。更新到最新稳定版Go是第一步,这能省去很多不必要的麻烦。你可以从Go官方网站下载对应的二进制包,解压后配置好
PATH
环境变量。安装LoongArch64交叉编译工具链: 这是关键。Go在交叉编译时,如果你的代码中使用了CGO(即调用C语言库),或者Go标准库中的某些部分(比如
net
包的DNS解析、os/user
等)需要依赖底层C库,那么你就必须提供一个能够为目标架构编译C代码的工具链。- Linux发行版用户: 如果你使用的是Debian/Ubuntu这类发行版,通常可以通过包管理器安装,例如:
sudo apt update sudo apt install gcc-loongarch64-linux-gnu g++-loongarch64-linux-gnu
对于其他发行版,包名可能略有不同,但思路一致。
- 手动获取/编译: 如果你的系统没有提供预编译包,或者你需要特定版本的工具链,可能就需要从Loongson官方、Linaro或者Buildroot等渠道获取预编译的交叉工具链,或者自己从源代码编译。下载后,将其bin目录添加到你的
PATH
环境变量中。
- Linux发行版用户: 如果你使用的是Debian/Ubuntu这类发行版,通常可以通过包管理器安装,例如:
配置环境变量进行交叉编译: 在执行
go build
或go install
命令前,你需要设置几个重要的环境变量来告诉Go编译器你的目标平台:CGO_ENABLED=1
:如果你需要CGO支持,这个是必须的。如果你的程序纯Go实现,不依赖任何C库,可以设为0
,这样可以避免对C交叉编译器的依赖,编译过程会更简单。但通常为了兼容性和功能完整性,CGO_ENABLED=1
是更稳妥的选择。GOOS=linux
:目标操作系统是Linux。GOARCH=loong64
:目标架构是LoongArch64。注意,Go语言中LoongArch64的GOARCH
值是loong64
,而不是loongarch64
。CC=loongarch64-linux-gnu-gcc
:指定用于编译C代码的交叉编译器。这个名字要与你安装的工具链中的实际可执行文件名称一致。
一个典型的编译命令会是这样:
CGO_ENABLED=1 GOOS=linux GOARCH=loong64 CC=loongarch64-linux-gnu-gcc go build -o myapp_loongarch64 ./main.go
这条命令会生成一个名为
myapp_loongarch64
的可执行文件,它可以在LoongArch64架构的Linux系统上运行。
为什么LoongArch64架构对Go开发有特殊要求?
我个人觉得,任何一个新架构的出现,都会给软件生态带来一阵“阵痛期”,LoongArch64也不例外。它之所以对Go开发有特殊要求,本质上是因为它是一个全新的、独立的指令集架构,与我们常见的x86(Intel/AMD)和ARM(手机、树莓派)有着根本性的不同。
首先,指令集不一样,这意味着CPU理解和执行代码的方式完全不同。Go编译器在生成机器码时,必须知道它要为哪种CPU“说话”。所以,Go需要专门针对LoongArch64编写后端代码生成器,才能把Go源代码翻译成LoongArch64能懂的机器码。这就像你需要一本新的“翻译词典”来将中文翻译成一种全新的外语。Go 1.19/1.20的更新就是加入了这本词典。
其次,是ABI(Application Binary Interface)的差异。ABI规定了函数调用、参数传递、寄存器使用等底层细节。不同的架构有不同的ABI,即使都是Linux系统,x86-64的ABI和LoongArch64的ABI也完全不同。当Go程序需要和C语言库(比如系统调用、或者你链接的第三方库)交互时,就必须遵循目标架构的ABI。这就是为什么CGO_ENABLED=1
时,我们必须提供一个LoongArch64的C交叉编译器——它不仅仅是编译C代码,更是确保Go和C之间的“握手”方式符合LoongArch64的规范。如果ABI不匹配,程序就会崩溃,或者行为异常,那种调试的酸爽,你懂的。
最后,就是生态成熟度的问题。x86和ARM经过几十年的发展,工具链、库、框架都非常成熟和丰富。LoongArch64作为后起之秀,虽然发展迅速,但在工具链的普及度、第三方库的适配上,还需要时间。这导致我们在配置环境时,往往不能像在x86上那样“无脑”地apt install
所有东西,有时候需要自己动手去寻找、配置甚至编译一些组件。这本身就是一种“特殊要求”,因为它需要我们投入更多的精力去理解底层。
如何获取并配置LoongArch64交叉编译工具链?
获取并配置LoongArch64交叉编译工具链,说白了就是找到那个能把C/C++代码编译成LoongArch64机器码的编译器集合,然后让你的系统知道它的存在。我个人觉得,这块儿才是真正的“体力活儿”和“踩坑重灾区”。
最省心的办法,如果你用的是主流Linux发行版,而且版本比较新,那就是直接通过包管理器安装。比如在Debian/Ubuntu系:
# 更新一下包列表,总是没错的 sudo apt update # 安装C和C++的交叉编译器 sudo apt install gcc-loongarch64-linux-gnu g++-loongarch64-linux-gnu # 如果还需要调试器,可以考虑安装 # sudo apt install gdb-multiarch
安装完成后,通常这些工具链的可执行文件(如loongarch64-linux-gnu-gcc
)会被放置在/usr/bin
目录下,并且系统会自动识别它们。你可以在终端里输入loongarch64-linux-gnu-gcc -v
来验证是否安装成功并查看版本信息。
如果你的发行版没有提供预编译包,或者你需要特定的工具链版本(比如,龙芯官方可能会提供优化过的版本),那么你就需要手动下载并配置。
- 寻找预编译工具链: 你可以去龙芯官网的开发者社区、或者一些开源项目(如Buildroot、Linaro的GCC Toolchains)寻找针对LoongArch64的预编译工具链包。这些通常是
.tar.xz
或.tar.gz
格式的压缩包。 - 解压到合适位置: 找一个你觉得合适的地方解压它,比如
/opt/loongarch64-toolchain
。sudo mkdir -p /opt/loongarch64-toolchain sudo tar -xf loongarch64-linux-gnu-toolchain-*.tar.xz -C /opt/loongarch64-toolchain --strip-components=1 # 注意,--strip-components=1 可能需要根据你的压缩包结构调整
- 配置环境变量: 这一步至关重要,你需要把工具链的
bin
目录添加到你的PATH
环境变量中,这样系统才能找到loongarch64-linux-gnu-gcc
等命令。同时,为了让Go知道用哪个编译器,你还需要设置CC
变量。# 假设你的工具链可执行文件在 /opt/loongarch64-toolchain/bin export PATH="/opt/loongarch64-toolchain/bin:$PATH" export CC="loongarch64-linux-gnu-gcc" # 确保这个名字和工具链里的实际文件名一致 export CXX="loongarch64-linux-gnu-g++" # 如果你还需要C++支持
为了让这些设置永久生效,你可以把它们添加到你的
~/.bashrc
、~/.zshrc
或~/.profile
文件中,然后执行source ~/.bashrc
(或其他文件)来立即生效。
配置完成后,你可以尝试编译一个简单的C程序来测试工具链是否工作正常:
// test.c #include <stdio.h> int main() { printf("Hello from LoongArch64 C!\n"); return 0; }
然后用你的交叉编译器编译:
loongarch64-linux-gnu-gcc test.c -o test_loongarch64_c # 如果没有报错,说明工具链基本可用了
这种手动配置的方式,虽然麻烦一点,但好处是你对工具链的来源和版本有完全的控制权,这在一些对环境有严格要求的项目中非常有用。
在实际开发中,Go交叉编译LoongArch64可能遇到哪些常见问题及解决方案?
在实际Go交叉编译LoongArch64的过程中,我个人经历过不少小插曲,有些让人抓狂,有些则一拍脑袋恍然大悟。这里列举一些常见的“坑”和我的解决思路:
“exec: "loongarch64-linux-gnu-gcc": executable file not found in $PATH”
- 问题描述: 这是最常见也是最直接的错误。当你设置了
CGO_ENABLED=1
,但系统找不到指定的交叉编译器时,Go就会报这个错。 - 原因分析: 要么是你根本没安装交叉编译器,要么就是安装了但它的
bin
目录没有添加到PATH
环境变量中,或者你CC
变量指定的编译器名称有误。 - 解决方案:
- 检查你是否已经通过包管理器(如
sudo apt install gcc-loongarch64-linux-gnu
)成功安装了工具链。 - 如果你是手动安装的,确保工具链的
bin
目录已经正确地添加到了PATH
环境变量中,并且在当前终端会话中已经生效(用echo $PATH
检查)。 - 确认
CC
环境变量的值(echo $CC
)与你工具链中实际的编译器可执行文件名称完全匹配。有时候,工具链提供的编译器名字可能不完全是loongarch64-linux-gnu-gcc
,而是带版本号的,比如loongarch64-linux-gnu-gcc-9
,这时你就需要相应地调整CC
变量。
- 检查你是否已经通过包管理器(如
- 问题描述: 这是最常见也是最直接的错误。当你设置了
“undefined reference to
__some_c_function
” 或 链接错误- 问题描述: 当你尝试编译Go程序时,即使C编译器找到了,但链接阶段却报错,提示某些C函数或库找不到。
- 原因分析: 这通常发生在
CGO_ENABLED=1
的情况下,你的Go程序依赖了某个C库,但这个C库没有为LoongArch64架构编译,或者编译器找不到它。Go的net
包、os/user
包等在某些情况下会依赖libc。 - 解决方案:
- 检查CGO依赖: 确认你的程序是否真的需要CGO。如果不需要,尝试设置
CGO_ENABLED=0
进行编译。但这会禁用所有CGO特性,可能会影响程序功能。 - 确保目标库存在: 如果你的Go程序确实需要链接特定的C库(比如
sqlite3
),那么你需要为LoongArch64架构编译这些C库的静态或动态版本,并确保交叉编译器在链接时能找到它们。这通常涉及到设置CGO_CFLAGS
和CGO_LDFLAGS
来指定头文件和库文件的路径。例如:CGO_ENABLED=1 GOOS=linux GOARCH=loong64 CC=loongarch64-linux-gnu-gcc \ CGO_CFLAGS="-I/path/to/loongarch64/include" \ CGO_LDFLAGS="-L/path/to/loongarch64/lib -lmyc_lib" \ go build -o myapp_loongarch64 ./main.go
- 静态链接: 尝试使用
-ldflags "-extldflags=-static"
来强制静态链接,这会把所有依赖的C库都打包进最终的可执行文件,减少对目标系统运行时库的依赖。但这会显著增加可执行文件的大小。
- 检查CGO依赖: 确认你的程序是否真的需要CGO。如果不需要,尝试设置
Go版本不兼容导致的问题
- 问题描述: 使用较旧的Go版本(例如Go 1.18或更早)进行LoongArch64交叉编译,可能会遇到各种奇奇怪怪的编译错误,或者即使编译成功,在目标机器上运行时也表现异常。
- 原因分析: 早期Go版本对LoongArch64的支持尚不完善,可能存在bug,或者某些指令集优化、ABI细节没有完全适配。
- 解决方案: 毫不犹豫地升级到最新的稳定版Go。Go 1.20及更高版本对LoongArch64的支持已经相当成熟,能解决绝大部分由Go版本引起的问题。
编译出来的程序在龙芯机器上运行报错“Bad system call”或其他运行时错误
- 问题描述: 编译过程一切顺利,但将生成的可执行文件拷贝到龙芯机器上运行,却直接崩溃或报错。
- 原因分析: 这种情况比较复杂,可能是:
- ABI不匹配: 虽然Go编译器和交叉C编译器都工作了,但可能某些底层库或者系统调用在LoongArch64上的实现方式与Go期望的有所偏差。
- 缺少运行时依赖: 如果是动态链接的程序,目标龙芯系统可能缺少程序运行时需要的特定动态库版本。
- 内核版本问题: 某些Go特性或系统调用可能依赖较新的Linux内核版本,而目标龙芯机器的内核版本过旧。
- 解决方案:
- 优先静态链接: 尝试使用
CGO_ENABLED=1 GOOS=linux GOARCH=loong64 CC=loongarch64-linux-gnu-gcc go build -ldflags "-extldflags=-static" -o myapp_loongarch64 ./main.go
。这能最大程度地减少对目标系统运行时库的依赖。 - 检查目标系统环境: 确保龙芯机器上的Linux发行版和内核版本相对较新,并且安装了常用的开发库(如
glibc
等)。 - 简化测试: 从一个最简单的“Hello World”程序开始测试,逐步增加复杂性,定位是哪个模块或依赖导致的问题。
- 使用
strace
: 在目标龙芯机器上,使用strace ./your_program
来跟踪程序执行时的系统调用,这有助于发现是哪个系统调用失败了。
- 优先静态链接: 尝试使用
总的来说,Go交叉编译LoongArch64,很多时候就是一场与环境变量、交叉工具链和CGO依赖的“搏斗”。只要你理解了它们各自的作用,并且在遇到问题时能有条不紊地检查这些点,大部分问题都能迎刃而解。这不像在x86上那样丝滑,但每一次成功,都像攻克了一个小堡垒,成就感还是蛮足的。
今天关于《Golang支持龙芯架构,LoongArch64编译配置教程》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

- 上一篇
- Gemini离线使用技巧与缓存管理方法

- 下一篇
- Golang错误处理实用技巧分享
-
- Golang · Go教程 | 31分钟前 |
- Golang跳过耗时测试用例方法
- 223浏览 收藏
-
- Golang · Go教程 | 38分钟前 |
- Golang错误处理:中间件与封装技巧解析
- 122浏览 收藏
-
- Golang · Go教程 | 42分钟前 |
- Golang状态模式为何更清晰?Context应用解析
- 175浏览 收藏
-
- Golang · Go教程 | 48分钟前 |
- Golang发送HTTP请求教程与客户端实现
- 114浏览 收藏
-
- Golang · Go教程 | 50分钟前 |
- Golang空指针处理技巧分享
- 272浏览 收藏
-
- Golang · Go教程 | 51分钟前 |
- Golang反射实现动态代理与AOP详解
- 403浏览 收藏
-
- Golang · Go教程 | 56分钟前 |
- Golang模块自动升级配置Dependabot方法
- 386浏览 收藏
-
- Golang · Go教程 | 59分钟前 |
- Golang微服务网关实现全解析
- 206浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- GolangRPC零拷贝技巧:共享内存与编码优化
- 465浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Golang并发陷阱:竞态与内存泄漏解析
- 129浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- CodeWhisperer
- Amazon CodeWhisperer,一款AI代码生成工具,助您高效编写代码。支持多种语言和IDE,提供智能代码建议、安全扫描,加速开发流程。
- 11次使用
-
- 畅图AI
- 探索畅图AI:领先的AI原生图表工具,告别绘图门槛。AI智能生成思维导图、流程图等多种图表,支持多模态解析、智能转换与高效团队协作。免费试用,提升效率!
- 35次使用
-
- TextIn智能文字识别平台
- TextIn智能文字识别平台,提供OCR、文档解析及NLP技术,实现文档采集、分类、信息抽取及智能审核全流程自动化。降低90%人工审核成本,提升企业效率。
- 43次使用
-
- 简篇AI排版
- SEO 简篇 AI 排版,一款强大的 AI 图文排版工具,3 秒生成专业文章。智能排版、AI 对话优化,支持工作汇报、家校通知等数百场景。会员畅享海量素材、专属客服,多格式导出,一键分享。
- 40次使用
-
- 小墨鹰AI快排
- SEO 小墨鹰 AI 快排,新媒体运营必备!30 秒自动完成公众号图文排版,更有 AI 写作助手、图片去水印等功能。海量素材模板,一键秒刷,提升运营效率!
- 38次使用
-
- Golangmap实践及实现原理解析
- 2022-12-28 505浏览
-
- 试了下Golang实现try catch的方法
- 2022-12-27 502浏览
-
- Go语言中Slice常见陷阱与避免方法详解
- 2023-02-25 501浏览
-
- Golang中for循环遍历避坑指南
- 2023-05-12 501浏览
-
- Go语言中的RPC框架原理与应用
- 2023-06-01 501浏览