mac下go与C的交叉编译+跨平台编译

提纲:

1,go与C的交叉编译

2,项目的跨平台编译

 

只说我的实现:

1,go与C的交叉编译

go项目嵌入C,编译使用cgo(https://github.com/golang/go/wiki/cgo#global-functions),动态链接的方式比较复杂,本来C部分还有C++,为使用方便,我要求C工程师把C++部分使用C实现,这里多说一句,有时碰到问题,不要一上来就埋头干,看能不能通过沟通解决或降低一定的复杂性,有些东西,前端实现起来很简单,后台实现起来很麻烦;也有些东西,前端实现很复杂,后台实现很简单,要多沟通,哪一端实现简单,就让哪一端去实现。go嵌入C,可以把C代码写到go代码文件里,也可以把C文件(.c/.h)独立出来,为了以后更好维护,我采用的是把C文件独立出来:

hello.h文件
void world();

hello.c文件
#include hello.h
 
void world(){
    printf("hello world...");
}

go文件
package main

/*
include "hello.h"
*/
import C

func main(){
    C.world()
}

这里比较关键的是import C与上面的(注释的)include,之间不能有空格。

不能使用go run,直接使用go run不能编译通过,使用go build编译成二进制文件,然后运行二进制文件,就OK了。

如果go调用的C有指针和数组这些操作,可以参考http://ju.outofmemory.cn/entry/337861,基本上实现起来不是很复杂。

 

2,跨平台编译

我自己的电脑是mac,服务器的系统是centos,所以我需要跨平台编译。因为我使用了beego框架,所以使用bee工具进行打包,

报错了,一个第一次碰到的错误,build constraints,很底层的样子,我想起我项目中有C,嗯,加上CGO_ENABLED=1,应该就OK了吧,于是我重新打包,又报错了

NND,好像这次的错误更底层,我想会不会是bee工具的问题,我就用go build打包吧,还报错

go build和bee打包,错误差不多,束手无策了。

找解决方案,百度、google都没有现成的方案,各种尝试,有些答案说需要安装xcode和xcode commond line,都不行,直到后来看到了xgo(https://github.com/karalabe/xgo),我觉得,这个应该能解决我的问题。

使用xgo需要先安装docker,还好我之前有使用过docker,对docker不陌生。docker最简单的描述就是:一个占资源很少的虚拟机,它NB在可以帮你下载软件,安装环境(变量),部署。详细介绍可以百度。

mac下安装docker

   https://docs.docker.com/docker-for-mac/install/,安装好了以后,右上方会有小海豚的图标。

然后安装xgo docker镜像(mac 命令行下):

   docker pull karalabe/xgo-lates

若下载镜像慢,可以参考https://www.jianshu.com/p/2137a0e22b40https://blog.csdn.net/small_to_large/article/details/77334973

然后安装xgo

   go get github.com/karalabe/xgo

测试xgo交叉编译环境是否OK:

   $ cd $GOPATH/src       // If you have multiple (I have at least 3 in there), change into any, doesn't matter
   $ mkdir xgo_test
   $ cd xgo_test
   $ echo -e 'package main\n import "fmt"\n func main(){\nfmt.Println("Hello")\n}' > main.go
   $ xgo .
执行完上述命令后在当前目录查看是否有编译生成的可执行文件,需要注意的是文件夹(xgo_test)需要在$GOPATH/src下。

使用xgo编译自己的项目

   cd 到项目目录下,使用命令:

   xgo --targets=linux/amd64 .

需要注意的是,自己的项目同样需要放到$GOPATH/src下。

xgo的命令、用法、功能很多,我只是结合自己遇到的问题,做了这个笔记;感兴趣的,可以去详细的了解xgo。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
平台交叉编译是指在一个平台编译生成在另一个不同平台上运行的可执行文件。对于使用 GCC 编译器进行平台交叉编译,你需要使用交叉编译工具链。 以下是一个简单的示例,演示如何使用 GCC 进行平台交叉编译: 1. 首先,你需要获取适用于目标平台交叉编译工具链。这个工具链包含了适用于目标平台编译器、库以及其他必要的工具。一般来说,你可以从交叉编译工具链的官方网站下载。 2. 安装交叉编译工具链,并确保将其添加到环境变量中。这样,你就能够在命令行中使用交叉编译工具链。 3. 现在,你可以使用交叉编译工具链来编译你的程序。假设你想将程序编译为在 ARM 架构上运行的可执行文件。使用以下命令: ``` $ arm-linux-gnueabi-gcc -o output_file input_file.c ``` 这里的 "arm-linux-gnueabi-gcc" 是交叉编译工具链提供的 GCC 编译器。"-o output_file" 指定了生成的可执行文件的输出路径和名称。"input_file.c" 是你要编译的源代码文件。 4. 执行以上命令后,GCC 将使用交叉编译工具链来生成适用于 ARM 架构的可执行文件。你可以将该可执行文件复制到目标平台上,并在目标平台上运行它。 请注意,平台交叉编译可能会涉及到一些特定的配置和参数,具体取决于你使用的工具链和目标平台。因此,建议你参考相关的文档和指南,以确保正确地进行平台交叉编译

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值