假定交叉编译链工具所在目录为:/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

交叉编译folly库相关推荐

  1. 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )

    文章目录 I . 动态库 与 静态库 II . 编译动态库 III. Android Studio 使用第三方动态库 IV . Android Studio 关键代码 V . 博客资源 I . 动态库 ...

  2. linux 交叉编译 静态库,从Linux为Windows开发交叉编译静态库

    我想在Linux中为Windows编译静态库.以下是我跟着编译从Linux为Windows开发交叉编译静态库 使用i586-mingw32msvc-cc -c static_lib.c -o stat ...

  3. OpenCASCADE:Android交叉编译 OCCT库

    OpenCASCADE:Android交叉编译 OCCT库 OpenCASCADE:Android交叉编译 OCCT库 配置 配置工具 配置 OCCT 生成 Makefile 构建 Makefile ...

  4. 【华为云技术分享】【玩转Atlas200DK系列】应用开发之 交叉编译第三方库并在工程中使用(jsoncpp)

    在本案中,我们以jsoncpp为例来介绍如何交叉编译第三方库,并在工程中是使用: 1. 从github上下载jsoncpp源码 wget https://github.com/open-source- ...

  5. folly库安装(4)folly依赖的重要组件安装:double-conversion, google-gflags, glog, fmt, googletest, boost等

    folly库依赖的组件版本可以在build\fbcode_builder\manifests目录查看,比如需要查看double-conversion的版本,只需要打开double-conversion ...

  6. folly库安装(1)cmake和gcc的安装、升级

    facebook的folly库是个很强大的c++库,是对标准c++库的强大补充,里面提供了很多高性能的组件,比如FbString, Futures, Executors, ConcurrentHash ...

  7. c/c++编译器配置(交叉编译重要参数)、交叉编译动态库与as配置、mk初步

    gcc/g++/clang,相当于javac: 了解c/c++编译器的基本使用,能够在后续移植第三方框架进行交叉编译时,清楚的了解应该传递什么参数. clang: clang 是一个C.C++.Obj ...

  8. 库编译:opencv 交叉编译静态库

    opencv 交叉编译静态库 一 概述 二 下载 opencv 三 编译 1 安装Opencv依赖环境 2 安装Cmake 3 运行Camke 配置opencv编译项 (1) 新建 build 文件夹 ...

  9. folly库的安装-Ubuntu18.04

    版权声明:原创文章,欢迎转载,但请注明出处,谢谢. https://blog.csdn.net/qiuguolu1108/article/details/106445831 folly库是facebo ...

最新文章

  1. ZOJ 3609 Modular Inverse(扩展欧几里得)题解
  2. 跨站脚本攻击(Cross‐Site Scripting (XSS))实践
  3. docker安装mysql数据库映射_Docker安装mysql数据库
  4. zookeeper专题:zookeeper集群模式下,leader选举流程分析
  5. Boost.ASIO简要分析-4 多线程
  6. Python——如何获得字符串的唯一编码
  7. 通过90行代码学会HTML5 WebSQL的4种基本操作 1
  8. 【数字信号】基于matlab DTMF电话拨号音识别【含Matlab源码 218期】
  9. 在Ubuntu中搭建嵌入式Linux开发环境
  10. 浏览器中cookies查看_如何在任何浏览器中阻止Cookies(除了您使用的网站外)
  11. java base64解码乱码_java base64解码 怎么是乱码呢
  12. 牛客真题编程——day16
  13. PaddleHub创意作品 -无价之姐之三十而已
  14. ubuntu开机密码破解
  15. monkey自动化测试脚本
  16. oracle lob类型和mysql text_LOB数据类型
  17. ORacle空间数据
  18. Linux 块设备之bio结构体
  19. window10 彻底关闭自动更新
  20. Android 容联云IM集成:初始化与登录中的坑

热门文章

  1. 51单片机(8051系列)最小系统图--内部时钟
  2. 计算机网络复习04——网络层
  3. 用latex写IEEE论文投稿的踩坑笔记
  4. spoolsv.exe占用cpu 100%的解决方法
  5. STM32 CRH和CRL设置方向
  6. java实用教程第五版电子书,爱了爱了
  7. 计算机睡眠后黑屏,电脑睡眠唤醒后一直是黑屏状态怎么办?
  8. Neuroimage | 孤独症与功能近红外光谱(fNIRS)综述
  9. matlab不是内部或外部命令_如何解决Telnet不是内部或外部命令(电脑提示telnet不是内部或外部命令...
  10. Java 的垃圾回收