上一篇有 @zi xiang 提出希望在FreeBSD下面编译试一试,我回答Linux版本应该直接可以编译。实际试了一下好像并没有那么顺利,但是代码本身是不需要任何改动的,主要是一些工具和环境问题(其实是编译基于GNU工具包会遇到的共通性问题)。这里记录一下遇到的问题:
(不熟悉FreeBSD的读者可以跳过。FreeBSD是比较严格遵从Unix标准开发的,所以与“参考Unix”开发的Linux还是有一些细节方面的差别,比Linux更难使用一些)
- Linux版本的ISPC无法在FreeBSD上面生成符合BSD规格的ELF文件。(报告类型3 ELF不支持)
解决的办法就是重新编译ISPC。虽然FreeBSD缺省安装自带clang和llvm,但是没有提供llvm-config这个程序和ISPC需要的llvm的库。所以需要从ports重新编译安装clang和llvm; - make和gmake的差别。ISPC自身是直接使用Makefile进行编译的,这个Makefile是按照GNU make的格式去写的。这里的问题是在BSD系列当中的make是Unix标准的老的make,与Linux当中的make(其实是GNU make)并不是完全一样的。所以会报很多错误。解决的方法其实也很简单,GNU make在BSD系统当中叫做gmake,只需要通过ports安装gmake,并用它build ISPC就可以了;
- 编译ISPC时提示找不到<alloca.h>。这个头文件在FreeBSD系统当中不存在,但是其实内容是被包括在stdlib.h当中的。所以解决的方法有两个:
- 改动代码,替换成stdlib.h;
- 自己在/user/include下面写一个alloca.h,里面就一行内容:#include <stdlib.h>
- ispc在链接阶段提示无法找到traceback这个函数。这个函数在FreeBSD当中位于libexecinfo.a当中,只需要修改ispc的Makefile,链接这个库就好了;
- Framework/Geometry/ispc/下面的代码编译的时候报‘sed’相关的错误。这个和上面第二条类似,我们到目前为止用的sed工具的全名叫GNU sed,与其原型——Unix系统下的sed已经不完全是一个东西了。FreeBSD当中的sed是Unix的老sed,GNU sed叫gsed,在Framework/Geometry/ispc/CMakeLists.txt当中替换一下就好了;
- 编译MyGameEngineOpenGL的时候提示找不到libdl。这是因为在FreeBSD当中libdl(动态库加载库)是统合在libc当中的。所以从链接库列表里面去掉‘-ldl’就好了
其他的比如找不到libxcb什么的,这个直接从ports安装就是了。通过pkg命令安装的只有动态库本身,不带头文件以及.a什么的开发用文件,所以需要通过ports编译安装是最好的。
基本就是这些。调整完毕的项目位于freebsd这个分支当中。
顺便提一下,虽然freebsd现在似乎并不是一个大家常用的系统,但是PS4是基于freebsd的。相对于Linux的GPL许可证,BSD许可证对于想要封闭自身知识产权的公司更为方便。所以诸如苹果和索尼等商业化公司一般都会选择它作为基础进行定制化开发。
大神!受我一拜!
赞赞