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 <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]项目构建容易出错的点在头文件和库的路径,这次因为构建的一个参数导致无法找到库,确实在我的意料之外。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容