假定交叉编译链工具所在目录为:/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++
直接用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
参数的,表示是必须的库,其他的表示可以不用。
在目录./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
目录。
下载:https://github.com/google/double-conversion
或者从配置文件中找到:
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
编译:
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
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
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并没有在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
下载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
下载glog:https://github.com/google/glog
主要设置三部分,首先设置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目录下,首先设置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
:
未完待续。。。。。。