交叉编译Boost
交叉编译务必注意配置 sysroot ,网上个个都没配就说编出来了,演都不演,也不知道谁抄谁的文章。
开始
官网下载最新Boost文件包,我使用Yocto的交叉编译工具链在1.86.0版本测试是没问题的。
解压并进入文件夹,执行如下命令生成b2
可执行文件并配置产物安装路径:
|
|
完事会看到文件夹多了个b2
可执行文件和project-config.jam
配置文件,编辑配置文件。
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 optionscflags
,cxxflags
,compileflags
andlinkflags
as options specifying flags that will be always passed to the corresponding tools. Values of thecflags
feature are passed directly to the C compiler, values of thecxxflags
feature are passed directly to the C++ compiler, and values of thecompileflags
feature are passed to both.许多工具集都具有
options
参数,用于微调配置。所有 Boost.Build 的标准编译器工具集都接受四个选项cflags
、cxxflags
、compileflags
和linkflags
作为选项,这些选项指定了将始终传递给相应工具的标志。cflags
功能的值直接传递给 C 编译器,cxxflags
功能的值直接传递给 C++ 编译器,而compileflags
功能的值则传递给两者。
例如:
|
|
所有支持的编译器及配置语法见《Boost Builtin tools》
修改project-config.jam
回到project-config.jam
,修改为如下内容:
|
|
其中注意如下几点:
- 保留其中的所有空格,估计是直接拼接的字符串,没有空格会拼接错误
- 需要为编译器和链接器设置
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无关,由工具链提供配置脚本:
|
|
然后执行以下命令即可编译Boost:
|
|
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
。