交叉编译folly库

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

未完待续。。。。。。

<think>好的,用户想了解或使用Folly,特别是使用指南或下载方法。首先,我需要回忆一下Folly的基本信息。Folly是Facebook开源的C++,专注于性能和实用性,包含各种高效的数据结构和算法。用户可能对如何下载和安装它,以及基本使用方法感兴趣。 根据引用[4],在CentOS 7上安装Folly比较麻烦,建议用Ubuntu。我需要先告诉用户系统要求,比如支持的Linux发行版和编译器版本。然后,下载步骤通常是通过Git克隆仓,但用户可能需要安装依赖项,比如CMake、g++等。安装过程可能涉及使用CMake构建和安装,这里需要详细说明步骤,但也要注意不同系统的差异。 接下来是使用指南部分,用户可能需要一个简单的示例来开始。例如,使用Folly的fbstring类,或者并发数据结构如AtomicHashMap。引用[3]提到atomic_queue常与其他异步框架结合使用,可能可以举一个多线程的例子。但要注意代码示例的正确性,确保语法正确,并且符合用户的实际应用场景。 另外,用户可能遇到安装问题,特别是依赖项缺失或编译错误。需要提醒他们查看官方文档,并确保所有依赖如Boost、Gflags安装正确。引用[4]提到安装过程复杂,可能需要特别指出常见问题,比如CentOS的依赖管理问题,建议使用Ubuntu以避免麻烦。 还要考虑用户的实际需求,他们可能是开发者,希望提高应用性能,所以需要强调Folly的优势,如高性能数据结构、并发工具等。引用[1]提到Folly帮助处理性能挑战,可以引用这一点来推荐。 最后,生成相关问题,可能涉及性能分析、具体组件的使用、与其他的对比,以及在不同系统上的安装问题。要确保问题覆盖用户可能进一步探索的方向。</think>### Folly使用指南及下载方法 Folly(Facebook Open Source Library)是Meta(原Facebook)开源的C++基础工具,专注于高性能与实用功能,包含字符串处理、并发数据结构、性能分析工具等模块[^1]。以下是关键使用指南: --- #### 一、安装指南(以Ubuntu为例) 1. **系统要求** - 支持Linux/macOS(推荐Ubuntu 20.04+/CentOS 8+) - 编译器:GCC 9+ 或 Clang 10+ - 依赖项:CMakeGit、Boost、Gflags 2. **下载与编译** ```bash # 克隆仓 git clone https://github.com/facebook/folly.git cd folly mkdir build && cd build # 编译安装 cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local make -j$(nproc) sudo make install ``` CentOS用户需手动安装更多依赖(如`libevent-devel`),建议优先使用Ubuntu[^4]。 --- #### 二、核心功能使用示例 1. **高性能字符串处理** ```cpp #include <folly/FBString.h> folly::fbstring str = "Folly测试"; str += " - 高效字符串操作"; fmt::print("{}\n", str); // 结合fmt输出[^2] ``` 2. **并发数据结构** ```cpp #include <folly/concurrency/AtomicHashMap.h> folly::AtomicHashMap<int, std::string> map(100); map.insert(1, "Value1"); auto it = map.find(1); if (it != map.end()) { fmt::print("Key 1: {}\n", it->second); } ``` 3. **异步编程支持** 结合`atomic_queue`实现任务队列[^3]: ```cpp #include <folly/MPMCQueue.h> folly::MPMCQueue<std::function<void()>> queue(100); // 生产者线程 queue.blockingWrite([] { fmt::print("Task executed\n"); }); // 消费者线程 std::function<void()> task; queue.blockingRead(task); task(); ``` --- #### 三、常见问题 1. **依赖缺失** 若编译报错,检查是否安装`libdouble-conversion-dev`、`libgflags-dev`等包。 2. **兼容性问题** 确保代码使用C++17及以上标准编译(CMake中添加`set(CMAKE_CXX_STANDARD 17)`)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值