交叉编译tdengine golang客户端

==背景==

平台的主要研发语言是golang,时序数据的存储准备用的influxdb及tdengine双引擎,

influxdb的go封装很顺利,tdengine的go封装本地执行很顺利,不过在交叉编译的时候遇到各种问题。

我需要在Windows开发环境编译代码,生成可以在linux环境运行的程序。

 

==版本==

golang:1.18

tdengine:2.6.0.12

服务器版本:ubentu 16.04

开发环境:Windows 10 64位 
 

==步骤==

1、安装WSL子系统
2、在子系统中安装golang
3、在子系统中安装gcc、g++
4、在子系统中安装td客户端
5、执行编译
 

==WSL安装==

在网上找了一堆,后来发现直接在Windows系统里安装一个WSL(子系统)是比较合适的方式,

具体可以参考:https://blog.csdn.net/q1009020096/article/details/117015763

1、在Windows Store中搜索Linux,选择想要安装的应用即可。

 

2、WSL其他操作命令

可以在cmd窗口中输入关于WSL的命令,这里简单罗列几个

查看列表:wsl -l
查看运行中的子系统:wsl -l --running
运行子系统:wsl -d Ubuntu-22.04
停止子系统:wsl -t Ubuntu-22.04
删除子系统:wsl --unregister Ubuntu-22.04

 

3、打开WSL

在开始程序中找到WSL子系统,点击打开即可。打开之后,会让你输入用户名和密码,我没有理它,直接关闭了。

再次打开之后,就不需要输入密码,直接可以使用了

 

4、更新软件

命令:sudo apt-get update

 

==在子系统中安装golang==

下载地址:https://docs.studygolang.com/doc/install

我这边用的版本是go1.18

我的所有程序统一安装到/usr/local下面

WSL可以很容易的将你电脑本地的程序复制到子系统中

比如我的安装包放在:D:\work\99_tools\golang

在WSL系统中的路径则是:/mnt/d/work/99_tools/golang/

 

操作命令:

cd /mnt/d/work/99_tools/golang/
cp go1.18.linux-amd64.tar.gz /usr/local/
cd /usr/local/

 

【坑1】

使用tar解压缩的时候,解压缩失败,最后发现是WSL子系统最近的一个Bug,太TMD坑了,这都能被我碰到

https://bugs.launchpad.net/ubuntu/+source/gzip/+bug/1966849

 

然后又努力在网上翻了一些网站,竟然真的有大神能够把这个坑避过去。

参考博客:https://www.jianshu.com/p/1fcd4369f830

在WSL子系统中输入命令:

echo -en '\x10' | sudo dd of=/usr/bin/gzip count=1 bs=1 conv=notrunc seek=$((0x189))

 

再次执行解压缩命令之后,就可以通过了。神奇。

(最后别忘了将生成的那一堆乱码文件删除掉)

 

最后将golang配置到环境变量中,如下图所示,

更新完之后,使用source /etc/profile使环境变量生效。

 

使用任意路径执行go version查看一下是否安装成功

 

==在子系统中安装gcc、g++==

执行命令:

sudo apt-get install -y gcc
sudo apt-get install -y g++

 

安装完成之后,执行命令验证是否成功:

gcc -v
g++ -v

 

==安装td客户端==

下载指定版本的客户端程序,我这里用的是TDengine-client-2.6.0.12-Linux-x64.tar.gz

执行命令:

cd /mnt/d/work/99_tools/tdengine/
cp TDengine-client-2.6.0.12-Linux-x64.tar.gz /usr/local/
cd /usr/local/
tar zxvf TDengine-client-2.6.0.12-Linux-x64.tar.gz
cd /usr/local/TDengine-client-2.6.0.12
./install_client.sh

 

==执行编译==

在代码工程中创建一个build_linux.sh

export GOPROXY=https://goproxy.io,direct
export CGO_ENABLED=1
export GOOS=linux
export GOARCH=amd64
export CC=gcc
export CXX=g++
go build .

 

【坑1】

没有截图了,根据记忆补充一下文字:

我的go程序中用到了xorm的,在编译的时候提示xxx build constraints exclude all Go files in xxx

意思是引擎了私有的地址,后来经过调查发现xorm的库地址变化了,

旧地址:github.com/go-xorm/xorm

新地址:xorm.io/xorm

 

【坑2】

在编译的时候,遇到错误

/amd64supported GOOS/GOARCH pair linux

将shell脚本中的export改为set就可以了。

set GOPROXY=https://goproxy.io,direct
set CGO_ENABLED=1
set GOOS=linux
set GOARCH=amd64
set CC=gcc
set CXX=g++
go build .

至于set和export的区别,在网上找了个描述,暂且记录。

set:显示(设置)shell变量 包括的私有变量以及用户变量,不同类的shell有不同的私有变量 bash,ksh,csh每中shell私有变量都不一样
env:显示(设置)用户变量变量
export:显示(设置)当前导出成用户变量的shell变量。

 

最终编译通过。

--END--

posted @ 2022-09-26 14:03  大墨垂杨  阅读(505)  评论(0编辑  收藏  举报