【问题标题】:Boost arm cross-compilation failsBoost arm交叉编译失败
【发布时间】:2013-12-17 18:06:07
【问题描述】:

我很难将 boost 库交叉编译到 arm 平台。
我从 http://sourceforge.net/projects/boost/files/boost/ 获取资源。我试过版本。 1.55、1.54 和 1.49 它们的行为都相同。

解压后我使用./bootstrap.sh --prefix=/blah/arm-none-eabi。 (arm-none-eabi 目录包含交叉编译器 includelib 目录,还有其他。)。接下来,我通过添加 using gcc : arm : arm-none-eabi-g++ ;(ARM EABI Sourcery CodeBench Lite 2013.05-23 交叉编译器,gcc 版本 4.7.3)来更新文件 tools/build/v2/user-config.jam。之后,我运行./bjam --prefix=/blah/arm-none-eabi/ toolset=gcc-arm。这给了我很多错误,例如:

`"arm-none-eabi-g++"  -ftemplate-depth-128 -O3 -finline-functions -Wno-inline -Wall -pthread  -DBOOST_ALL_NO_LIB=1 -DBOOST_THREAD_USE_LIB=1 -DNDEBUG  -I"." -c -o "bin.v2/libs/wave/build/gcc-arm/release/link-static/threading-multi/wave_config_constant.o" "libs/wave/src/wave_config_constant.cpp"

...failed gcc.compile.c++ bin.v2/libs/wave/build/gcc-arm/release/link-static/threading-multi/wave_config_constant.o...
gcc.compile.c++ bin.v2/libs/wave/build/gcc-arm/release/link-static/threading-multi/cpplexer/re2clex/aq.o
arm-none-eabi-g++: error: unrecognized command line option '-pthread'`

我修改了文件$BOOST/tools/build/v2/tools/gcc.jam

-case *       : option = -pthread ; libs = rt ;
+case *       : option = -lpthread ; libs = rt ;

再次运行交叉编译后,我得到了很多

"arm-none-eabi-g++"  -ftemplate-depth-128 -O3 -finline-functions -Wno-inline -Wall -pedantic -lpthread -fPIC -Wextra -Wno-long-long -Wno-variadic-macros -pedantic -DBOOST_ALL_DYN_LINK=1 -DBOOST_ALL_NO_LIB=1 -DBOOST_SYSTEM_DYN_LINK=1 -DBOOST_SYSTEM_NO_DEPRECATED -DNDEBUG  -I"." -c -o "bin.v2/libs/chrono/build/gcc-arm/release/threading-multi/chrono.o" "libs/chrono/src/chrono.cpp"

...failed gcc.compile.c++ bin.v2/libs/chrono/build/gcc-arm/release/threading-multi/chrono.o...
gcc.compile.c++ bin.v2/libs/chrono/build/gcc-arm/release/threading-multi/thread_clock.o
gcc.compile.c++ bin.v2/libs/chrono/build/gcc-arm/release/threading-multi/process_cpu_clocks.o
...skipped <pbin.v2/libs/chrono/build/gcc-arm/release/threading-multi>libboost_chrono.so.1.54.0 for lack of <pbin.v2/libs/chrono/build/gcc-arm/release/threading-multi>chrono.o...
...skipped <pstage/lib>libboost_chrono.so.1.54.0 for lack of <pbin.v2/libs/chrono/build/gcc-arm/release/threading-multi>libboost_chrono.so.1.54.0...
...skipped <pstage/lib>libboost_chrono.so for lack of <pstage/lib>libboost_chrono.so.1.54.0...
gcc.link.dll bin.v2/libs/context/build/gcc-arm/release/threading-multi/libboost_context.so.1.54.0
/home/skramer/PP/MGR/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/bin/ld: cannot find -lrt
collect2: error: ld returned 1 exit status

    "arm-none-eabi-g++"    -o "bin.v2/libs/context/build/gcc-arm/release/threading-multi/libboost_context.so.1.54.0" -Wl,-h -Wl,libboost_context.so.1.54.0 -shared -Wl,--start-group "bin.v2/libs/context/build/gcc-arm/release/threading-multi/asm/make_arm_aapcs_elf_gas.o" "bin.v2/libs/context/build/gcc-arm/release/threading-multi/asm/jump_arm_aapcs_elf_gas.o"  -Wl,-Bstatic  -Wl,-Bdynamic -lrt -Wl,--end-group -lpthread 

...failed gcc.link.dll bin.v2/libs/context/build/gcc-arm/release/threading-multi/libboost_context.so.1.54.0...
...skipped <pstage/lib>libboost_context.so.1.54.0 for lack of <pbin.v2/libs/context/build/gcc-arm/release/threading-multi>libboost_context.so.1.54.0...
...skipped <pstage/lib>libboost_context.so for lack of <pstage/lib>libboost_context.so.1.54.0...
gcc.compile.c++ bin.v2/libs/coroutine/build/gcc-arm/release/link-static/threading-multi/detail/standard_stack_allocator_posix.o
libs/coroutine/src/detail/standard_stack_allocator_posix.cpp:14:22: fatal error: sys/mman.h: No such file or directory
compilation terminated.

 "arm-none-eabi-g++"  -ftemplate-depth-128 -O3 -finline-functions -Wno-inline -Wall -lpthread  -DBOOST_ALL_NO_LIB=1 -DNDEBUG  -I"." -c -o "bin.v2/libs/coroutine/build/gcc-arm/release/link-static/threading-multi/detail/coroutine_context.o" "libs/coroutine/src/detail/coroutine_context.cpp"

...failed gcc.compile.c++ bin.v2/libs/coroutine/build/gcc-arm/release/link-static/threading-multi/detail/coroutine_context.o...
...skipped <pbin.v2/libs/coroutine/build/gcc-arm/release/link-static/threading-multi>libboost_coroutine.a(clean) for lack of <pbin.v2/libs/coroutine/build/gcc-arm/release/link-static/threading-multi>detail/standard_stack_allocator_posix.o...
...skipped <pbin.v2/libs/coroutine/build/gcc-arm/release/link-static/threading-multi>libboost_coroutine.a for lack of <pbin.v2/libs/coroutine/build/gcc-arm/release/link-static/threading-multi>detail/standard_stack_allocator_posix.o...
...skipped <pstage/lib>libboost_coroutine.a for lack of <pbin.v2/libs/coroutine/build/gcc-arm/release/link-static/threading-multi>libboost_coroutine.a...
gcc.compile.c++ bin.v2/libs/date_time/build/gcc-arm/release/threading-multi/gregorian/greg_month.o
gcc.compile.c++ bin.v2/libs/date_time/build/gcc-arm/release/threading-multi/gregorian/greg_weekday.o
gcc.compile.c++ bin.v2/libs/date_time/build/gcc-arm/release/threading-multi/gregorian/date_generators.o
gcc.link.dll bin.v2/libs/date_time/build/gcc-arm/release/threading-multi/libboost_date_time.so.1.54.0
/home/skramer/PP/MGR/arm-2013.05/bin/../lib/gcc/arm-none-eabi/4.7.3/../../../../arm-none-eabi/bin/ld: cannot find -lrt
collect2: error: ld returned 1 exit status

我现在真的不知道该怎么办。我已经在谷歌上搜索了几个小时,但没有结果。我尝试使用 b2 而不是 bjam - 没有任何改变。我还尝试了不同的 arm 交叉编译器 - Xilinx EABI Sourcery CodeBench Lite 2012.03-83 (gcc 4.6.3),它似乎产生的错误更少,但仍然有很多语法,并且没有类似文件或目录的错误存在。如何在 arm 平台上获得提升?

【问题讨论】:

  • 看起来您需要 -std=c++11 编译器选项集(-pthread 仅在此 AFAIK 中受支持)。您实际使用的是哪个 GCC 版本?实际上,我们正在自己构建最新的 GCC (4.8) ARM 跨工具链版本。
  • 这个链接可能有帮助(它描述了使用 GCC 4.7 构建跨工具链,但 GCC 4.8 并没有真正的区别):dev-jungle.blogspot.de/2013/09/…
  • 感谢您的回答。我已将 -std=c++11 添加到 gcc.jam(例如 "arm-xilinx-eabi-g++" -ftemplate-depth-128 -O3 -finline-functions -Wno-inline -Wall -std=c++11 -pthread -DBOOST_ALL_NO_LIB=1 -DBOOST_THREAD_USE_LIB=1 -DNDEBUG -I"." -c -o "bin.v2/libs/wave/build/gcc-arm/release/link-static/threading-multi/token_ids.o" "libs/wave/src/token_ids.cpp"),但我仍然不断收到有关无法识别的选项“-pthread”的错误。您提供的链接使用配置,这不能与 boost 一起使用。可能还有其他想法吗?
  • -std=c++11 没有被 GCC 4.7 完全实现(尤其不是所有的 std::thread 部分)。我发给你的链接描述了如何构建 GCC 工具链,它与 boost 构建过程本身没有任何关系。
  • 好的,我现在明白了。我会试一试,然后告诉你!

标签: c++ boost cross-compiling


【解决方案1】:
  1. error: 'sys/mman.h: No such file or directory - 编译器找不到头文件“sys/mman.h”,因为包含路径不正确或您的系统不包含此文件。

  2. 您为嵌入式系统编译,例如arm-non-eabi(用于裸机)。 boost.context 不支持此 ABI。要禁用构建 boost.context 和 boost.coroutine(取决于 boost.context),您必须调用:b2 --without-context --without-coroutine

【讨论】:

  • 该库按原样存在于 /usr/include/sys 中,我找不到的库是 rt.h 。我会试一试你的 b2 调用。
  • 不幸的是,我不断收到关于无法识别的 pthread 选项的错误,无论有无 std=c++11 选项。也许还有其他想法?
猜你喜欢
  • 1970-01-01
  • 2015-06-11
  • 2016-01-15
  • 1970-01-01
  • 2023-03-16
  • 2021-02-26
  • 2014-03-14
  • 2017-10-12
  • 2019-11-23
相关资源
最近更新 更多