golang交叉编译sqlite的问题解决-cgo交叉编译

话说写了个删除任务的小东西,用到sqlite是:github.com/mattn/go-sqlite3 这个库支持database/sql接口,基于cgo那么问题来了。在默认情况下cgo是不允许交叉编译的,我mac下开发的想编译到centos上cgo跨平台不好使用。没办法只能掏出docker

docker run --rm -v $GOPATH:/go golang:1.10 bash -c 'cd $GOPATH/src/code && CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build delete_task.go'

可以按自己需求修改,编译完会自动删除容器

  • –rm 删除容器
  • -v 把宿主机gopath映射到容器gopath这样就不用下载包代码什么的
  • golang:1.10 go镜像版本
  • bash -c 直接bash命令
  • cd $GOPATH/src/code 进入容器项目目录,-v已经把宿主机上面项目都弄到容器里
  • CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build delete_task.go 编译delete_task.go程序文件
<think>嗯,用户之前问了关于`upx -9`的问题,现在又问Golang中的自举和cgo。需要确定用户的背景,可能是在学习Go语言,或者在进行项目开发时遇到了相关概念。用户可能对Go语言的底层机制或与其他语言的交互感兴趣。 首先,自举在编程语言中的通用概念是指用该语言自身编写其编译器。Go的自举是从Go 1.5版本开始,之前是用C写的。需要解释自举的意义,比如减少对其它语言的依赖,提升开发效率,同时说明自举后的编译器结构,如分前和后。 然后是cgo,用户可能需要在Go中调用C代码,或者反过来。需要解释cgo的作用,如何通过import "C"来嵌入C代码,以及使用场景,比如性能优化、利用现有C库。同时要提到cgo的缺点,比如增加编译复杂度,跨平台问题,性能开销等。 用户可能想知道为什么需要自举,以及使用cgo的注意事项。比如自举带来的好处,或者使用cgo时如何避免常见陷阱。需要结构清晰,分点解释,用例子辅助说明,比如给出cgo的代码示例。 还要注意用户可能对术语不熟悉,需要用简单易懂的语言解释。例如,自举可能被误解为其他概念,需要明确其在此处的特定含义。cgo部分要强调它与Go的交互方式,以及潜在的问题,如内存管理、类型转换等。 最后总结两者的重要性和适用场景,帮助用户理解何时使用自举和cgo,以及它们的优缺点。确保回答准确,覆盖关键点,避免技术错误。</think>以下是关于 Go 语言中 **自举(Bootstrapping)** 和 **CGO** 的详细解释: --- ### 一、自举(Bootstrapping) #### 定义 自举(Bootstrap)指用 Go 语言自身编写 Go 编译器,实现 **“自己编译自己”** 的过程。 #### 发展过程 1. **早期阶段** Go 1.4 之前的编译器(`gc`)是用 C 语言编写的。 2. **自举实现** 从 Go 1.5 开始,Go 编译器完全改用 Go 语言重写,并通过以下步骤完成自举: - 用 C 语言编写的旧版编译器(Go 1.4)编译出 **新 Go 编译器的二进制文件** -编译器再用 Go 代码编译自身,形成 **自循环编译**。 #### 自举的意义 | 优势 | 说明 | |------|------| | **摆脱对 C 的依赖** | 编译器不再依赖 C 工具链,简化构建环境 | | **加速开发迭代** | Go 语言特性可直接用于编译器开发 | | **标准化工具链** | 所有 Go 工具(编译器、格式化工具等)均用 Go 实现 | --- ### 二、CGO #### 定义 CGOGo 语言提供的 **与 C 语言交互** 的机制,允许在 Go 代码中直接调用 C 函数或使用 C 库。 #### 核心用法 1. **嵌入 C 代码** 通过 `import "C"` 前插入 C 代码块: ```go // #include <stdio.h> import "C" func main() { C.printf(C.CString("Hello from C!\n")) } ``` 2. **调用 C 函数** Go 代码中通过 `C.函数名` 调用 C 函数(需注意类型转换)。 #### 典型场景 | 场景 | 说明 | |------|------| | **复用 C 库** | 如调用 OpenSSL、SQLite 等现有 C 库 | | **性能优化** | 对计算密集型代码用 C 实现加速 | | **系统级操作** | 直接调用操作系统底层 C 接口 | #### CGO 的代价 | 缺点 | 说明 | |------|------| | **编译复杂度** | 需本地 C 工具链,交叉编译困难 | | **内存管理风险** | Go 的 GC 不管理 C 内存,需手动释放 | | **性能开销** | Go 与 C 之间的调用存在上下文切换成本 | | **类型转换繁琐** | 需用 `C.CString`、`C.GoBytes` 等手动转换类型 | --- ### 三、自举 vs CGO 对比 | 特性 | 自举 | CGO | |--------------|--------------------------|-------------------------| | **目的** | 实现编译器自依赖 | 跨语言调用 C 代码 | | **应用层级** | 语言工具链层面 | 代码交互层面 | | **复杂性** | 对普通开发者透明 | 需处理跨语言细节 | | **使用场景** | 所有 Go 开发者间接受益 | 需与 C 交互的特定场景 | --- ### 四、实际建议 1. **优先避免 CGO** - 尽量用纯 Go 实现功能(如用 `net/http` 替代 `libcurl`) - 若必须使用 CGO,隔离 C 相关代码到独立模块 2. **自举的意义** 普通开发者无需关心自举实现,但其保证了 Go 工具链的独立性和健壮性。 --- ### 附:CGO 编译命令 ```bash # 编译CGOGo 代码 export CGO_ENABLED=1 go build -o myapp ``` 如果需要跨平台编译,需配置对应平台的 C 交叉编译器(如 `x86_64-w64-mingw32-gcc`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值