前几天自己安装了go环境,准备自己编译rclone,使用go build
指令第一次就编译成功了,也没有报错、也没有其他的别的提示。但是后来准备使用rclone挂载的时候才发现自己编译的rclone没有mount这个标签。昨天经过一天的努力、发现了其中的端倪、给大家分享一下。
完整编译的大致流程
由于自行编译也没太大必要,而且很多小白很多环境也没有,搭建复杂,这里只给想自行编译研究学习的人一个大致的完整流程。希望能给大家减轻压力。
1、安装git for windows
链接如下:https://gitforwindows.org/
2、拉取cgofuse
github:https://github.com/billziss-gh/cgofuse
#命令
git clone https://github.com/billziss-gh/cgofuse.git
3、拉取rclone(PS:国内拉取较慢)
github:https://github.com/rclone/rclone
git clone https://github.com/rclone/rclone.git
4、Go环境安装
5、安装cgofuse所需要的环境
#Windows cgo
WinFsp, gcc (e.g. from Mingw-builds)
#macOS
FUSE for macOS, command line tools
#Linux
libfuse-dev, gcc
....
#其余的自己在github上看
下载FUSE for macOS点我跳转→;下载 command line tools点我跳转→
Mingw的安装教程点我跳转→(PS:这个安装较慢、建议提前安装)
6、install cgofuse
#Windows cgo
#Prerequisites: WinFsp, gcc (e.g. from Mingw-builds)
#Build:
cd cgofuse #指git下来的cgofuse的项目地址、建议先移动到你的src里,不可盲抄代码
#64位
set CPATH=C:\Program Files (x86)\WinFsp\inc\fuse
go install -v ./fuse ./examples/memfs
#32位
set CPATH=C:\Program Files\WinFsp\inc\fuse
go install -v ./fuse ./examples/memfs
#macOS
#Prerequisites: FUSE for macOS, command line tools
#Build:
cd cgofuse #指git下来的cgofuse的项目地址、建议先移动到你的src里,不可盲抄代码
go install -v ./fuse ./examples/memfs ./examples/passthrough
#Linux
#Prerequisites: libfuse-dev, gcc
#Build:
cd cgofuse #指git下来的cgofuse的项目地址、建议先移动到你的src里,不可盲抄代码
go install -v ./fuse ./examples/memfs ./examples/passthrough
#其余的自己在github上看
7.修改rclone关于onedrive部分的代码
具体修改内容可以到github这个地址看:https://github.com/rclone/rclone/pull/4072/files
8.设置好你的目标编译路径
cd yourpath/github/rclone/rclone //进入rclone项目路径
set CGO_ENABLED=1
set GOARCH=?//win32:386、win64:amd64
go build -tags "cmount"
//如果报错xxx不存在,说明前面某环节配置有问题。或者项目没有在你的go可以识别的路径下
说明几个问题、有利于大家理解:
1、怎么判断自己的rclone有没有mount标签?
很简单、执行rclone mount、如果提示以下内容、则证明没有mount标签。
rclone mount
Error: unknown command "mount" for "rclone"
Run 'rclone --help' for usage.
2020/03/17 09:32:39 Fatal error: unknown command "mount" for "rclone"
2、rclone包里有关于mount指令相关的内容吗?
答:rclone里面有关于rclone的指令包,但是执行mount还需要一定的环境。
4、直接编译rclone,没有mount标签,为什么不会出错?
答:我猜测这时因为mount这个标签是rclone项目包中独立的一个可选包,而且这一部分内容应该是rclone项目调用其他项目的成果,并且这个包需要其他的运行环境(详见下文)。
有以下两个依据:
第一、我在rclone的project中有一个工程是fuse、而mount需要fuse环境。
第二、我在github的rclone项目Pull request、修改完具体的代码后、github平台检验我的代码时build的代码是go build -v --ldflags "-s -X github.com/rclone/rclone/fs.Version=v1.51.0-108-g58fa094f-merge-beta" -tags "cmount"
虽然我也不太理解-tags啥意思、但是直接使用该指令会提示你升级https://github.com/billziss-gh/cgofuse,证明cmount是依赖这个项目的。
5、当你实际搭建的时候git clone https://github.com/billziss-gh/cgofuse.git
完这环境后发现windows关于build这个cgofuse的方式有两种,怎么选择?
答:首先解释一下前一种是cgo、后一种是!cgo(我猜应该是非cgo的意思)。
当然是第一种、项目的名字就是cgofuse、不用cgo对cgofuse项目的编译不会出错、编译rclone也不会出错,但是rclone就是没有mount选项你能咋办?
最后要注意的是,cgo编译方式需要WinFsp的环境和Mingw的环境。
6、未解决:我们知道go是可以跨平台编译的,但是实际在win64位编译win32位的rclone过程中,为什么搭载好了的cgofuse的编译环境,不能编译出win32位的带有mount的程序呢?
答:首先要说的是,无论在任何系统中对rclone的编译、都是可以跨平台的比方说win→linux,linux→win,(注:win64与win32之间是不跨平台的)。但是这样编译出来的rclone没有与之对应的平台的cgofuse的环境基础,自然不会给你编译出cgofuse的mount环境了。
简单点讲:cgofuse是不可以跨平台的,因为它还需要适用于本地的其他运行环境,不同平台关于这方面的环境是不同的。但是rclone是可以跨平台的,而rclone可以需要cgofuse,又可以不需要。所以不报错。
但是前面我也说了win64和win32之间不是跨平台,为什么win64的环境不能完整编译win32的包呢?这里由于我也没有真正成功过,我这里也给不出答案。我检查过winfsp环境、go环境,都是32位和64位都支持的,但是编译环境Mingw,由于太复杂,我并没有查出来是不是Mingw32位的问题。如果这个三个问题都不是,但就是系统的问题了。这里po下在set GOARCH=386
的条件下直接install-cgofuse的错误,供大家研究。
有什么问题可以随时联系我邮箱,欢迎打扰
<wangtaijie@midd.top>
版权所有yoola's Blog
本文链接:https://www.yoola.top/pub/id=11
转载请注明来源