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

Golang交叉编译

Golang交叉编译遇到的问题

  • 交叉编译
    • go支持的平台和版本

交叉编译

go支持的平台和版本

查询命令:

	go tool dist list

显示结果:

	aix/ppc64android/386android/amd64android/armandroid/arm64darwin/amd64darwin/arm64dragonfly/amd64freebsd/386freebsd/amd64freebsd/armfreebsd/arm64illumos/amd64ios/amd64ios/arm64js/wasmlinux/386linux/amd64linux/armlinux/arm64linux/loong64linux/mipslinux/mips64linux/mips64lelinux/mipslelinux/ppc64linux/ppc64lelinux/riscv64linux/s390xnetbsd/386netbsd/amd64netbsd/armnetbsd/arm64openbsd/386openbsd/amd64openbsd/armopenbsd/arm64openbsd/mips64plan9/386plan9/amd64plan9/armsolaris/amd64windows/386windows/amd64windows/armwindows/arm64
  1. golang 在跨平台编译时,只需要指定目标操作系统的 OS(GOOS="darwin")和 CPU 架构(GOARCH="amd64")
    
  2. 通过 go env -w GOARCH=xxx 来进行指定
    
  3. 在不需要引入 CGO 代码进行交叉编译时,需要指定 CGO_ENABLE=0
    
  4. 使用 CGO 代码时,必须指定 CGO_ENABLE=1
    
  5. 当 CGO_ENABLE=1 时,必须制定了交叉编译链,CC=gcc  和 CXX=g++
    
  6. 假设我们编译32位 mipsle 平台的程序,就要提前下载 mipsle 版本的c++交叉编译工具CGO_ENABLED=1 GOOS=linux GOARCH=mipsle CC="mipsel-linux-uclibc-gcc" CXX="mipsel-linux-uclibc-g++" go build xxx.go
    
  7. mips是big-endian的mips架构,mipsel是little-endian的mips架构
    
  8. 如果调用的 CGO 调用了 C 代码中的各种依赖库,那么在编译的时候回报依赖库 not found
    
  9. 解决方案是必须在编译时,加上指定的参数,链接的库必须交叉编译到目标平台的系统库而不是当前系统
    
  10. 主要是三个参数:-I , -isystem , -L 
    
  11. 例如:CGO_ENABLED=1 GOOS=linux GOARCH=mipsle CC=mipsel-linux-uclibc-gcc -Wall -std=c++11 -Llib -isystem/aarch64/usr/include -L/aarch64/lib -ldl -lpthread -Wl,-rpath-link,/aarch64/lib -L/aarch64/lib/aarch64-linux-gnu -L/aarch64/usr/lib -I/aarch64/usr/include -L/aarch64/usr/lib/aarch64-linux-gnu -ldl -lpthread -Wl,-rpath-link,/aarch64/usr/lib/aarch64-linux-gnu -lphonon -lcurl -lprotobuf go build xxx.go
    
  12. 尽量不要用 CGO ,会降低代码的可读性和交叉编译的复杂度,以及后期维护
    
http://www.lryc.cn/news/68256.html

相关文章:

  • kafka3.x详解
  • kubectl常用命令|pod生命周期|金丝雀发布|超详细
  • 【Linux系统】Linux进程信号详解
  • 阿里云u1服务器通用算力型CPU处理器性能测评
  • hive的详细使用文档和使用案例
  • KL散度
  • Java基础学习(16)多线程
  • 【一起啃书】《机器学习》第五章 神经网络
  • matlab实验二可视化
  • (数据结构)栈的实现——再一次保姆级教学
  • 【5G RRC】RSRP、RSRQ以及SINR含义、计算过程详细介绍
  • K8s(Kubernetes)学习(一):k8s概念及组件
  • Web3 常用语和黑话你知道吗?
  • 物联网和边缘计算:如何将数据处理和决策推向设备边缘
  • 【Android学习专题】java基本语法和概念(学习记录)
  • Android系统启动全流程分析
  • RabbitMQ --- 惰性队列、MQ集群
  • 1.Buffer_Overflow-1.Basic_Jump
  • MySQL入门语法第三课:表结构的创建
  • SpringSecurity框架学习与使用
  • DHCP+链路聚合+NAT+ACL小型实验
  • 西瓜书读书笔记整理(三)—— 第二章 模型评估与选择
  • AcWing算法提高课-1.3.6货币系统
  • vue3回到上一个路由页面
  • Linux三种网络模式 | 仅主机、桥接、NAT
  • 数据库设计与前端框架
  • 技术探秘:揭秘Bean Factory与FactoryBean的区别!
  • MD-MTSP:遗传算法GA求解多仓库多旅行商问题(提供MATLAB代码,可以修改旅行商个数及起点)
  • 技术面试的终极指南:助你取得成功的关键步骤
  • Nautilus Chain 测试网第二阶段,推出忠诚度计划及广泛空投