filament编译要求
具体安装要求和安装步骤可以查看目录下的BUILDING.md.
截图如下:
总的来说就是:安装cmke、clang,编译ninja、glibc++、libc++abi源码并安装
安装cmake
cmake 各版本 https://cmake.org/files/
这里我选择cmake3.21的二进制文件:
https://cmake.org/files/v3.21/cmake-3.21.0-rc1-linux-x86_64.tar.gz
解压:
tar -xzvf cmake-3.21.0-rc1-linux-x86_64.tar.gz
mv cmake-3.21.0-rc1-linux-x86_64 cmake3.21
然后就可以直接用了。
或者手动编译cmake
我尝试编译过cmake3.22
编译种出现缺少openss库的问题,安装该库便可解决,安装命令:yum install openss-devel
问题1.error: OpenSSL Crypto library not found
解决方案:yum -y install openssl-devel
安装Clang
我下载的是centos8.4,里边内置了gcc 8.4,clang直接可以通过命令安装:
yum install clang
所以只需要下载ninja,不过可惜的是ninja不能直接下载,需要手动编译。
注:
(强烈建议采用新一点的系统,之前我还安装了一个centos7.7,里边啥都没有,费事的很,最后选择了最新的centos--8.4)
ninja编译和安装
编译安装ninja
ninja需要依赖于re2c,否则编译是会报错,re2c是一款语法分析器,
编译安装依赖re2c
下载链接: https://github.com/skvadrik/re2c/releases/编译:
tar -xvf re2c-2.2.tar.gz
cd re2c-2.2/
./autogen.sh
./configure
make
make install
编译安装ninja
下载link:https://github.com/ninja-build/ninja/releases编译:
tar -xvf ninja-1.10.2.tar.gz
cd ninja-1.10.2
./configure.py --bootstrap
ninja比较精简,只需要一个可执行文件即可,现在可以做软链或者复制到/usr/bin下面就可以直接调用了
sudo cp ninja /usr/bin
完成!
注:ninja本身很小,建议手动编译,不建议直接用网上的bin,我尝试过下载网上的bin,解压后执行,提示:不能执行的二进制。
Glibc++和libc++abi的安装
Clang的定制C++库是libc++(libcxx)。然后,libcxx还需要一个ABI库,libc++abi(libcxxabi)。不幸的是,这两个库有一个循环依赖问题。为了打破循环依赖问题,可以在不连接libc++abi的情况下构建libc++。然后,使用这个libc++,我们可以构建libc++abi链接到libc++。最后,使用libc++abi,我们可以构建一个新的libc++链接到libc++abi。
1. 获取libc++,libc++abi
http://releases.llvm.org/4.0.1/libcxx-4.0.1.src.tar.xz
http://releases.llvm.org/4.0.1/libcxxabi-4.0.1.src.tar.xz
2. 下载好了以后,两个都解压出来,得到两个目录:
libcxx-4.0.1.src
libcxxabi-4.0.1.src
3. 第一轮构建libcxx,不需要libcxxabi参与。
cd libcxx
# It is not recommended to build libcxx in the source root directory.
# So, we make a tmp directory.mkdir tmp
cd tmp
# Specifying CMAKE_BUILD_TYPE to Release shall generate performance optimized code.
# The CMAKE_INSTALL_PREFIX changes the install path from the default /usr/local to /usr.
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..sudo make install
cd ..rm tmp -rf
cd ..
4. 构建libcxxabi libc++。
cd libcxxabimkdir tmp
cd tmp
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIBCXXABI_LIBCXX_INCLUDES=../../libcxx/include ..sudo make install
cd ../..
5. 第2轮使用libcxxabi构建libcxx。
cd libcxxmkdir tmp
cd tmp
# This time, we want to compile libcxx with libcxxabi, so we have to specify LIBCXX_CXX_ABI=libcxxabi and the path to libcxxabi headers, LIBCXX_LIBCXXABI_INCLUDE_PATHS.
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIBCXX_CXX_ABI=libcxxabi -DLIBCXX_CXX_ABI_INCLUDE_PATHS=../../libcxxabi/include ..
sudo make install
6. 编写一个C++测试程序。
// t.cpp
#include <iostream>using namespace std;int main() {
cout << "Hello world!" << endl;
}
7. 通过clang++测试C++编译。
# -std specifies the C++ standard. -stdlib specifies the C++ library you want to use with clang/clang++. -lc++abi is necessary, because the new LD (linker and loader) on CentOS 7 doesn't allow indirect library linking.
clang++ -std=c++11 -stdlib=libc++ -lc++abi t.cpp
./a.out
编译问题
问题1.找不到文件#include<new>
解决方法:
首先通过find命令进行查找:
查找到new在usr/include/c++/v1中,其他的请忽略,之前是没有的。
修改cmake参数将:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIBCXXABI_LIBCXX_INCLUDES=../../libcxx/include ..sudo make install
cd ../..
修改为:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIBCXXABI_LIBCXX_INCLUDES=/usr/include/c++/v1/ ..
即,指定include的路径。
第2轮使用libcxxabi构建libcxx同样报找不到xxx.h文件
修改cmake参数如下:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLIBCXX_CXX_ABI=libcxxabi -DLIBCXX_CXX_ABI_INCLUDE_PATHS=../../libcxxabi-4.0.1.src/include/ ..
filament编译
步骤如下:
1.Cmake-gui 构建、生成
或者
通过命令行构建
mkdir -p out/cmake-release
cd out/cmake-release
CC=/usr/bin/clang CXX=/usr/bin/clang++-11 CXXFLAGS=-stdlib=libc++ \
cmake -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../release/filament ../..
[if !supportLists]2. [endif]到/root/Downloads/filament_build目录执行:ninja
[if !supportLists]3. [endif]ninjia install
注:建议通过cmake-gui构建,可以对cmake参数进行选择。
glibc++和glibc++abi正确安装后,错误1不会出现
错误1.CMake“cmake is not able to compile a simple test program”
经常弄编译,CMake可视化界面配置一些CMake工程的时候,主要是windows下的mingw32版本的,经常会出现c和cxx编译器过不去的情况,其实路径都没有问题,尝试多种方法并且解决了,如重装系统,换cmake版本,但是不可能遇到每次都换。
原理
其实检查编译器这个步骤我们可以判断是没问题的,所以直接在检测C和CXX两个脚本上去掉这2个检查即可。
修改文件
两个文件所在文件夹:C:\CMake\share\cmake-3.10\Modules
C检查脚本路径:CMakeTestCCompiler.cmake
CXX检查脚本路径:CMakeTestCXXCompiler.cmake
错误2.Error in configuration porcess
实际错误:
需要指定clang编译器,cc为啥没有报错,是因为做了软链接CC->/usr/bin/clang
所以需要将C++编译器修改为clang++-11如下图:
错误3.python is not found
Find / -name python*发现有python只不过名称为python3所以我做了一个软链接
ln -s /usr/bin/python /usr/local/bin/python3
错误4.fatal error: xlocale.h: No such file or directory
#include <xlocale.h> // because, on some systems, <locale.h> doesn’t include <xlocale.h>; this makes sure that we get both
原因:新版本ubuntu已不在支持xlocal
解决方法:
方法一:
在cmake里面添加
add_definitions(-DXLOCALE_NOT_USED)
方法二:
建立软连接
sudo ln -s /usr/include/locale.h /usr/include/xlocale.h
错误5.lgcc_s not found
此问题困扰我许久,做软连接、直接拷贝文件,尝试了都不行,最后用cmake-gui进行构建,取消掉USE_STATIC_LIBCXX的勾选才得以解决
去掉USE_STATIC_LIBCXX,因为我编译的libcxx库没有.a只有.so即没有静态库,只有动态库。否则会报lgcc_s not found错误
1.缺少xcb.h头文件,直接安装libxcb*库便可
错误6缺少<GL/gl.h>头文件,yum install libgl*
错误7缺少xf86vmode.h,直接yum install libX*
编译成功!
filament编译总结
[if !supportLists]1. [endif]网速很重要,前面因为担心要下载很久,所以选择了一个4.9G的linux进行部署,里边的c++版本非常低,需要升级,升级时间非常长。而且clang不能直接用命令进行安装。这个问题应该配置一下安装源可以解决
[if !supportLists]2. [endif]做开发的虚拟机建议分配100G以上,我最开始分配40G,然后swap自动的会比较小。有好几次出现了内存不够,编译失败。
[if !supportLists]3. [endif]Make -j4针对依赖强的库,会编译出错,所以谨慎用之
[if !supportLists]4. [endif]项目构建容易出错的点在头文件和库的路径,这次因为构建的一个参数导致无法找到库,确实在我的意料之外。