由于自己一直使用Mac, 虽然可以在虚拟机里跑一个Ubuntu来完成节点编译和运行, 但是总感觉不太爽. 所以就吃饱了闲的, 在自己的Mac系统上编译了一次PlatON源码, 没想到竟然成功了. 在这里分享一下, 有意愿瞎玩的同学, 可以玩一下. 没什么意思, 纯粹为了好玩.
言归正传, 描述一下过程吧:
系统环境
我使用的系统环境如下:
- OS: MacOS 10.15.7
- Xcode: 12.4
- Go: 1.16.9
依赖库
为了编译PlatON, 另外安装了以下两个lib:
brew install gmp && brew install openssl@1.1
因为是自己一直使用的开发机, 是不是有哪些依赖库我已经安装过了, 这个我就不太清楚了. 如果你在编译过程中遇到缺少了其它的库, 那就要自己麻烦安装上了.
设置环境变量
为了能够编译bls.git, 需要明确指定一下go的依赖库:
go env -w CGO_LDFLAGS="-g -O2 -L/usr/local/Cellar/gmp/6.2.1/lib -L/usr/local/Cellar/openssl@1.1/1.1.1k/lib"
$ go env -w CGO_CFLAGS="-g -O2 -I/usr/local/Cellar/gmp/6.2.1/include -I/usr/local/Cellar/openssl@1.1/1.1.1k/include"
大家需要在自己的gmp和openssl安装目录下, 检查一下真实的路径, 替换掉上面的内容.
源码修改
由于mac系统不允许(也可能是我不知道)修改系统fdlimits, 所以我简单的修改了utils/cmd/flags.go
文件中的这个方法:
func makeDatabaseHandles() int {
limit, err := fdlimit.Maximum()
if err != nil {
Fatalf("Failed to retrieve file descriptor allowance: %v", err)
}
raised, err := fdlimit.Raise(uint64(1024)) // 设置合理的fd限制
if err != nil {
Fatalf("Failed to raise file descriptor allowance: %v %d %d", err, limit, raised)
}
return int(raised / 2) // Leave half for networking and other stuff
}
否则在创建创世块的时候, 会由于不能修改fdlimits而失败.
编译源码
到这里, 就可以开始编译源码了:
$ go mod download
$ sudo make all
这里要注意的是sudo make all
, 需要使用sudo权限, 否则会出错, 提示xxxx permission denied
之类的错误.
遇到的问题
- 和
#include <cmath>
相关的提示"xxx not in global namespace"
如果你也遇到了这个问题, 那么可以尝试这样解决:
将
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/cmath
文件中的 #include <math.h> 替换成
#include</Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/math.h>
后续
如果成功的编译了源码, 那么你就可以按照官方文档来运行一个测试节点.~~~~~~~~~~~~~