前几天自己安装了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上看

下载WinFsp点我跳转→;下载Mingw点我跳转→

下载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

转载请注明来源