交叉编译folly库

article/2025/11/5 20:44:23

假定交叉编译链工具所在目录为:/home/softwares/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/,其c++编译器为:/home/softwares/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-g++

1. 下载folly源码,并交叉编译其依赖库:

直接用git clone就行了,默认是最新的master分支,也可以切换到Tags分支(Tags分支是稳定的??):

git clone https://github.com/facebook/folly.git
cd folly/

依赖库可以到自带的文件中查看:

cd ./build/fbcode_builder/manifests/
ls

这个目录下有所有依赖的库的文件,每个文件里面包含了folly所依赖的版本以及下载链接,以及需要编译哪些库(比如boost库有很多的库,folly只需要其中的一大部分即可),依赖库可以从这里找到并下载。
另外,folly依赖的库,并不一定都需要,需要看看哪些是必须依赖,哪些是非必须依赖。可以在./CMake/folly-deps.cmake中看到,那些用find_package()且是REQUIRED参数的,表示是必须的库,其他的表示可以不用

1.1 交叉编译boost库:

在目录./build/fbcode_builder/manifests/下找到boost,打开下载boost包,或者到官网下载最新boost也行。
在这里插入图片描述

去boost官网下载:https://www.boost.org/users/download/
在这里插入图片描述
下载后解压,查看当前boost可以编译的库(boost是一个库集合,包含了很多库,可以查看和选择某些库来编译):

cd boost_1_78_0/
./bootstrap.sh --show-libraries

在这里插入图片描述

执行boost预编译脚本,进行库选择以及配置:

export LD_LIBRARY_PATH=/home/softwares/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH}
./bootstrap.sh --without-libraries=python --with-toolset=gcc

由于我的交叉编译工具中没有python相关的头文件和库,因此无法编译boost的python库,所以就去掉这个库。这样,其他boost库都会被编译。如果只想编译其中某些库,则可以用--with-libraries参数,库名称用逗号隔开。详情执行--help来查看。

设置交叉编译工具:
上述命令执行完如果不出错,则会生成一个配置文件project-config.jam,打开文件此文件,配置:

在这里插入图片描述
注意,:之间有空格,特别是最后一个分号;前面必须有一个空格。

编译:
执行编译命令:

./b2

如果没有出错,就会生成各个库,最后install到想要的位置即可:

./b2 install --prefix=/opt/folly_lib/dependents/dep_bins

会把boost库以及头文件复制到/opt/folly_lib/dependents/dep_bins目录。

1.4 交叉编译double-conversion:

下载:https://github.com/google/double-conversion
或者从配置文件中找到:
在这里插入图片描述

配置CMakeLists,设置交叉编译c++工具:
在这里插入图片描述
编译:

mkdir _build/
cd _build/
export LD_LIBRARY_PATH=/home/softwares/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH}
cmake .. -DCMAKE_INSTALL_PREFIX=/opt/folly_lib/dependents/dep_bins
make -j4
make install

交叉编译libevent:

下载:
在这里插入图片描述

配置CMakeLists,设置交叉编译c++工具:
在这里插入图片描述
在这里插入图片描述

编译:

mkdir _build/
cd _build/
export LD_LIBRARY_PATH=/home/softwares/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH}
cmake .. -DCMAKE_INSTALL_PREFIX=/opt/folly_lib/dependents/dep_bins
make -j 4
make install

交叉编译openssl:

下载:
在这里插入图片描述
预编译:

export LD_LIBRARY_PATH=/home/softwares/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH}
./config no-asm --prefix=/opt/folly_lib/dependents/dep_bins --cross-compile-prefix=/home/softwares/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-

注意加上no-asm参数,另外,--cross-compile-prefix参数是交叉编译工具的完整路径的前缀,即去掉g++或者gcc字符串

生成Makefile后,打开,将其中的-m64删除,不然编译报错:
在这里插入图片描述
最后编译:

make -j 4
make install

交叉编译fmt库:

下载:
在这里插入图片描述
设置CMakeLists:
在这里插入图片描述
编译:

mkdir _build
cd _build
export LD_LIBRARY_PATH=/home/softwares/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH}
cmake .. -DCMAKE_INSTALL_PREFIX=/opt/folly_lib/dependents/dep_bins
make -j 4
make install

交叉编译jemalloc:

jemalloc并没有在folly的依赖里面写明,但是folly需要用到jemalloc,所以也需要编译。
下载:

#下载master分支源码编译
git clone https://github.com/jemalloc/jemalloc.git 

配置并编译:

export LD_LIBRARY_PATH=/home/softwares/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH}
./autogen.sh --prefix=/opt/folly_lib/dependents/dep_bins --host=aarch64-linux-gnu CC=/home/softwares/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc CXX=/home/softwares/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-g++make -j 4
make install

1.2 交叉编译gflags:

下载gflags:https://github.com/gflags/gflags/releases
在这里插入图片描述
或者从folly的依赖文件中找:
在这里插入图片描述

解压后设置CMakeLists.txt(设置编译器路径,并打开动态库和静态库开关):
在这里插入图片描述

在这里插入图片描述

编译:

mkdir _build/
cd _build/
export LD_LIBRARY_PATH=/home/softwares/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH}
cmake .. -DCMAKE_INSTALL_PREFIX=/opt/folly_lib/dependents/dep_bins
make -j4
make install

1.3 交叉编译glog:

下载glog:https://github.com/google/glog

在这里插入图片描述
或者从folly的依赖文件中找:
在这里插入图片描述

解压后,打开CMakeLists.txt进行设置:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

主要设置三部分,首先设置c++编译器,然后打开静态库生成开关,最后关闭gtest和libunwind(libunwind我的交叉编译工具里面没有,又不想安装,你懂的),最后指定一下刚才上一步生成的gflags库,注意版本号。
最后编译:

mkdir _build/
cd _build/
export LD_LIBRARY_PATH=/home/softwares/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH}
cmake .. -DCMAKE_INSTALL_PREFIX=/opt/folly_lib/dependents/dep_bins
make -j4
make install

编译folly:

进入folly目录下,首先设置CMakeLists.txt交叉编译器:
在这里插入图片描述

删除-msse4.2标记,用空字符串""来代替(arm中没有msse4.2):
在这里插入图片描述

另外,在test代码中有几处代码有问题(目前为止(20230326)没修复,不修改的话会报错),需要修改相关的测试代码:
folly/detail/SplitStringSimdImpl.h

uint16x8_t u16s = vreinterpretq_u8_u16(test);
修改成:
uint16x8_t u16s = vreinterpretq_u16_u8(test);return vget_lane_u64(vmovn_u16(u16s), 0);
修改成:
return vget_lane_u64(vreinterpret_u64_u8(vmovn_u16(u16s)), 0);

最后设置CMake/folly-deps.cmake

未完待续。。。。。。


http://chatgpt.dhexx.cn/article/rjhKQ2Ki.shtml

相关文章

folly库安装(5)folly的安装

上面这些准备工作做完了,现在就可以安装folly了,其实这时folly的安装已经非常顺利了。网上有人说folly的安装很麻烦,最重要是上面的准备工作没做好,只要你按照我上面的文章,一步步做下来,安装成功是没问题的…

揭秘Facebook官方底层C++函数Folly

2019独角兽企业重金招聘Python工程师标准>>> Folly与Boost、当然还有std等组件库的关系是互为补充,而不是彼此竞争。实际上,只有当我们需要的东西既没有,也无法满足所需的性能要求时,我们才开始定义自己的组件。 性能问…

《设计原则》(一)

易理解性和易使用性的设计原则 提供一个好的概念模式;(一个好的概念模式使用户能够预测操作的行为效果)可视性(消除执行阶段和评估阶段的鸿沟);自然匹配;(利用物理环境类比和文化标准概念、空间类比&#…

C++设计模式的设计原则(面向对象八大设计原则)

面向对象设计八大设计原则 一、温故面向对象二、八大设计原则三、以史为鉴 先掌握八大设计原则,再详细看23种设计模式(👈点我) 一、温故面向对象 (1)隔离变化:从宏观层面上来看,面向…

设计原则设计模式

导论 什么是设计原则:判断程序设计质量好坏的准则。什么是设计模式:软件设计过程中重复出现问题的解决方案设计原则的作用:指导抽象、类、类关系设计,相当于指导设计程序基础框架(Rank-分层、Role-角色、Relation-类关…

设计原则详解

1.单一职责 一个类,只有一个引起它变化的原因。应该只有一个职责。每一个职责都是变化的一个轴线&#…

五大设计原则——SOLID

目录 简介: 1、单一职责原则(SRP) 2、开闭原则(OCP) 3、里式替换原则(LSP) 4、依赖倒置原则 (DIP) 5、接口隔离原则 (ISP) 简介: 无论是软件系统设计,还是代码实现…

1. 设计原则

文章目录 设计原则思维导图核心理论SOLID单一职责开放封闭里式替换接口隔离依赖反转 KISSDRYLOD 设计原则思维导图 核心理论 基于接口编程 “基于接口而非实现编程” - “Program to an interface, not an implementation”。 “接口”就是一组“协议”或者“约定”&#xff…

七大设计原则

一、七大设计原则 (1)单一职责原则 (2)接口隔离原则 (3)依赖倒置原则 (4)里氏替换原则 (5)开闭原则 (6)迪米特法则 &#xff0…

chrome浏览器截长图

使用chrome浏览器 打开开发者模式(更多工具->开发者工具) mac 按commandshiftp windows 按ctrlshiftp 然后输入capture 选择capture full size screenshot就可以了 截了个长图的例子

手把手教你截长图

1.截长图的工具 相信很多小伙伴在平时工作做都会碰见截图的问题,那正常的图,我们有各种方式去截取,例如:QQ的CtrlAltA,微信的AltA等等 但是呢,如果要用到长图的时候,就束手无策了,这…

python如何截长图_利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)...

对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素。若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了。 WebDriver.PhantomJS自带的方法支持对整个网页截屏。 下面提供几种思路。 方式一 针对WebDriver.Chro…

谷歌浏览器怎么截长图?

我们在使用电脑浏览网页的时候难免会需要进行一些长图的截取,而一般的截图只能实现一部分截取,那么我们要如何去实现这个操作呢?下面小编就给大家介绍一下怎么在谷歌浏览器上截长图的操作。 谷歌浏览器网页截长图怎么截? 1、进入C…

html2canvas截长图

github链接 一、下载运行后选择下图的html2canvas即可直接去到路由界面测试 二、下图是html2canvas路由页面,点击右上角的生成图片即可下载长图 三、源码路径(html2canvas源码github) 四、源码(关键在generateImage 这个方法&…

selenium+phantomjs截长图踩坑

目录 需求背景: 调研 phantomjs selenium 服务器部署 需求背景 BI上的报表需要设置定时任务截图发邮件到订阅人的邮箱中。刚开始以为截图的活是前端的,后来发现使自己的锅。 调研 截图的研究了一下,主流应该是 selenium 和 phantomjs。…

microsoft edge怎么截长图_实用技能 | Fireshot 网页截长图工具

FireShot 网页截长屏插件 网页截图有没有什么好方法? 在我们平常的工作、生活和学习中,截图是我们最常用到的功能之一。小编平常用到的是QQ、微信、电脑自带的快捷截图功能以及红蜻蜓截图软件等。 但是在浏览网页时,这些工具功能出现了一个致命的缺点,看到一个长长的文章,…

snipaste怎么滚动截长图_如何截长图,这3种方法你用过吗?

在工作中,经常需要截长图,那在电脑上你一般是如何操作呢?本期Word妹与大家分享2种快速截图技巧。 1、借用QQ工具 在最新的QQ版本中有一个长截图按钮,点击之后直接拉动需要长截图的内容,最后点击完成即可。 2、借用FastStone Capture工具 FSCapture是绿色版本不需要安装,可…

计算机win7截长屏,电脑截长图【应对法子】

喜欢使用电脑的小伙伴们一般都会遇到win7系统电脑截长图的问题,突然遇到win7系统电脑截长图的问题就不知道该怎么办了,其实win7系统电脑截长图的解决方法非常简单,按照 1:打开要截图的WORD文档,点击左上角的另存为或者…

网页截长图

很多时候我们需要在网页上截长图,下面记录下谷歌浏览器截长图的步骤: 1.在浏览器的右上角处找到三个竖着的小黑点按钮,点击选择该按钮,选择更多工具–>开发者工具 2.点击开发者工具后会显示这样的一个小窗口 3.按下CTRLShif…

分享电脑中截图的五种方法(包括截长图)

💂 个人网站:【 海拥】【弗莱迪的物理实验】【开发文档导航】🤟 风趣幽默的前端学习课程:👉28个案例趣学前端💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼小组】💬 免费且实用的计算机…