linux下编译filament

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

解决方法:

首先通过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 // because, on some systems, doesn’t include ; 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缺少头文件,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]项目构建容易出错的点在头文件和库的路径,这次因为构建的一个参数导致无法找到库,确实在我的意料之外。

你可能感兴趣的:(linux下编译filament)