交叉编译Boost

交叉编译务必注意配置 sysroot ,网上个个都没配就说编出来了,演都不演,也不知道谁抄谁的文章。

开始

官网下载最新Boost文件包,我使用Yocto的交叉编译工具链在1.86.0版本测试是没问题的。

解压并进入文件夹,执行如下命令生成b2可执行文件并配置产物安装路径:

1
./bootstrap.sh --prefix=output

完事会看到文件夹多了个b2可执行文件和project-config.jam配置文件,编辑配置文件。

参照《Boost Cross-compilation

When using gcc, you first need to specify your cross compiler in user-config.jam (see the section called “Configuration”)

当使用 gcc 时,你首先需要在 user-config.jam 中指定你的交叉编译器(参见 “配置” 一节)

这里就是影响交叉编译的地方,着重注意!其中有如下内容:

Many of toolsets have an options parameter to fine-tune the configuration. All of Boost.Build’s standard compiler toolsets accept four options cflags, cxxflags, compileflags and linkflags as options specifying flags that will be always passed to the corresponding tools. Values of the cflags feature are passed directly to the C compiler, values of the cxxflags feature are passed directly to the C++ compiler, and values of the compileflags feature are passed to both.

许多工具集都具有 options 参数,用于微调配置。所有 Boost.Build 的标准编译器工具集都接受四个选项 cflagscxxflagscompileflagslinkflags 作为选项,这些选项指定了将始终传递给相应工具的标志。cflags 功能的值直接传递给 C 编译器,cxxflags 功能的值直接传递给 C++ 编译器,而 compileflags 功能的值则传递给两者。

例如:

1
        using gcc : 3.4 : : <compileflags>-m64 <linkflags>-m64 ;

所有支持的编译器及配置语法见《Boost Builtin tools

修改project-config.jam

回到project-config.jam,修改为如下内容:

1
2
3
4
5
if ! gcc in [ feature.values <toolset> ]
{
    using gcc ; 
    using gcc : arm : aarch64-poky-linux-g++ : <compileflags>--sysroot=/你的/sysroot/路径/aarch64-poky-linux <linkflags>--sysroot=/你的/sysroot/路径/aarch64-poky-linux <compileflags>-编译器参数 <compileflags>--其他 ; 
}

其中注意如下几点:

  • 保留其中的所有空格,估计是直接拼接的字符串,没有空格会拼接错误
  • 需要为编译器和链接器设置sysroot,否则编译器找不到头文件,链接器找不到系统库
  • 编译器参数也按照工具链提供的进行设置

这些值可以在source <工具链配置脚本>后从环境变量获取,按如上形式添加进去。

在Stack Overflow上的问题《crti.o file missing》中提到:

in cross compiling setting sysroot is crucial. Just setting sysroot in compiler is not enough, as @surajit declared one must also configure in linker setting. In some IDEs it is done in “Miscellaneous” menu.

在交叉编译中,设置 sysroot 至关重要。仅仅在编译器中设置 sysroot 是不够的,因为@surajit声明还必须在链接器设置中进行配置。在某些 IDE 中,它是在 “Miscellaneous” 菜单中完成的。

编译

此时可以source配置交叉编译环境,这个和Boost无关,由工具链提供配置脚本:

1
source /你的/交叉编译工具链/配置脚本

然后执行以下命令即可编译Boost:

1
./b2 toolset=gcc-arm target-os=linux link=static threading=multi install
  • toolset=toolset:Indicate the toolset to build with. | 使用的编译器版本,对应project-config.jam中的设置
  • target-os:产物运行的操作系统,如果目标操作系统与主机不同,则需要另外指定,此处可忽略
  • link=static|shared:Whether to build static or shared libraries | 编译产物是动态库还是静态库,看自己需求
  • threading=single|multi:Whether to build single or multithreaded binaries | 是否使用多线程
  • install:安装到前面设置的output/文件夹

更多内容执行b2 --help查看。

其他

至于裁剪等操作,执行bootstrap.sh时就可以设置,这里不再赘述。

交叉编译中务必注意配置sysroot

引用