在Mac上运行PlatON节点

由于自己一直使用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> 

解决方案来源于: macos - Catalina C++: Using <cmath> headers yield error: no member named 'signbit' in the global namespace - Stack Overflow

后续

如果成功的编译了源码, 那么你就可以按照官方文档来运行一个测试节点.~~~~~~~~~~~~~

image

2 个赞


Hey bro, i did everything as you said. Check paths twice, change function code and tried to start and got these exceptions