交叉编译tdengine golang客户端
==背景==
平台的主要研发语言是golang,时序数据的存储准备用的influxdb及tdengine双引擎,
influxdb的go封装很顺利,tdengine的go封装本地执行很顺利,不过在交叉编译的时候遇到各种问题。
我需要在Windows开发环境编译代码,生成可以在linux环境运行的程序。
==版本==
golang:1.18
tdengine:2.6.0.12
服务器版本:ubentu 16.04
==步骤==
==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--