用于PowerPC架构的交叉编译Boost库

时间:2013-02-20 07:59:54

标签: c++ linux boost powerpc

我正在尝试为PowerPC架构交叉编译Boost库(Thread,System)。我按照以下步骤,但面临问题。

我运行一个shell脚本来设置我的工具链。编译器ppc_4xx-g ++在shell中可见。

遵循的步骤:

  1. 添加“使用gcc:power:ppc_4xx-g ++;”行到文件user-config.jam
  2. 在根目录中运行./bootstrap.sh --prefix = BoostPowerPC。
  3. 运行./b2 install --build-dir = BoostPowerPC toolset = gcc-power --with-thread --with-system stage
  4. 结果:创建了所有目录但编译失败。我无法附加错误日志(请将您的电子邮件发送给我,以便我可以在需要时向您发送错误日志)。以下是错误日志的快照。

    Component configuration:
    
    - atomic                   : not building
    - chrono                   : not building
    - context                  : not building
    - date_time                : not building
    - exception                : not building
    - filesystem               : not building
    - graph                    : not building
    - graph_parallel           : not building
    - iostreams                : not building
    - locale                   : not building
    - math                     : not building
    - mpi                      : not building
    - program_options          : not building
    - python                   : not building
    - random                   : not building
    - regex                    : not building
    - serialization            : not building
    - signals                  : not building
    - system                   : building
    - test                     : not building
    - thread                   : building
    - timer                    : not building
    - wave                     : not building
    
    ...patience...
    ...found 20376 targets...
    ...updating 10110 targets...
    common.mkdir BoostPowerPC
    common.mkdir BoostPowerPC/lib
    common.mkdir BoostPowerPC/boost
    common.mkdir BoostPowerPC/boost/bin.v2
    common.mkdir BoostPowerPC/boost/bin.v2/libs
    common.mkdir BoostPowerPC/boost/bin.v2/libs/system
    common.mkdir BoostPowerPC/boost/bin.v2/libs/system/build
    common.mkdir BoostPowerPC/boost/bin.v2/libs/system/build/gcc-power
    common.mkdir BoostPowerPC/boost/bin.v2/libs/system/build/gcc-power/release
    common.mkdir BoostPowerPC/boost/bin.v2/libs/system/build/gcc-power/release/threading-multi
    gcc.compile.c++ BoostPowerPC/boost/bin.v2/libs/system/build/gcc-power/release/threading-multi/error_code.o
    In file included from ./boost/config/select_stdlib_config.hpp:18,
                 from ./boost/config.hpp:40,
                 from ./boost/system/config.hpp:13,
                 from libs/system/src/error_code.cpp:18:
    /opt/ELDK/4.2/ppc_4xx/usr/include/c++/4.2.2/cstddef:50:28: error: bits/c++config.h: No such file or directory
    In file included from /opt/ELDK/4.2/ppc_4xx/usr/include/c++/4.2.2/ios:43,
                 from /opt/ELDK/4.2/ppc_4xx/usr/include/c++/4.2.2/ostream:45,
                 from /opt/ELDK/4.2/ppc_4xx/usr/include/c++/4.2.2/iterator:70,
                 from ./boost/iterator.hpp:17,
                 from ./boost/operators.hpp:86,
                 from ./boost/system/error_code.hpp:17,
                 from libs/system/src/error_code.cpp:19:
    .
    .
    .
    

    抱怨找不到文件c ++ config.h。但该文件位于/opt/ELDK/4.2/usr/include/c++/4.2.2/powerpc-linux/bits目录中

    然后我尝试在b2命令中使用标签“include”。但后来我收到一个错误,找不到文件cstddef,它出现在目录/opt/ELDK/4.2/usr/include/c++/4.2.2中。我想我正在编写包含路径。

    您认为这是什么问题?为什么我的编译器即使它存在也无法找到该文件?有什么建议吗?

    更新

    我使用了-d + 2和-q选项,结果如下。

    "ppc_4xx-g++"  -ftemplate-depth-128 -O3 -finline-functions -Wno-inline -Wall -pedantic -pthread -fPIC  -DBOOST_ALL_NO_LIB=1 -DBOOST_SYSTEM_DYN_LINK=1 -DNDEBUG  -I"." -I"/opt/ELDK/4.2/ppc_4xx/usr/include" -c -o "BoostPowerPC/boost/bin.v2/libs/system/build/gcc-power/release/threading-multi/error_code.o" "libs/system/src/error_code.cpp"
    

    编译日志:

    In file included from ./boost/config/select_stdlib_config.hpp:18,
                 from ./boost/config.hpp:40,
                 from ./boost/system/config.hpp:13,
                 from libs/system/src/error_code.cpp:18:
    /opt/ELDK/4.2/ppc_4xx/usr/include/c++/4.2.2/cstddef:50:28: error: bits/c++config.h: No such file or directory
    

    正如我们所看到的那样,包含所需文件的更高目录并且对编译器可见。我甚至尝试使用-L命令并指定根目录。它仍然无济于事。

    我检查了ppc_4xx-g ++的编译选项以及对我感兴趣的2个选项

    1. - sysroot =:这是编译器使用的所有包含和库的根目录。

    2. -B:使用此功能,我们可以为编译器添加搜索路径。

    3. 我试过了两次,但没有帮助。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

首先,这对Boost.Build来说并不是一个问题。这意味着通过执行最后一个命令(失败),在命令行上手动运行它,然后调整它直到它工作,将更容易修复它。

如上所述,您应该从命令行中删除-I"/opt/ELDK/4.2/ppc_4xx/usr/include"

通常,编译器应自动找到自己的头文件。有两件事可能会影响到这一点:

  1. 您正在从实际安装编译器标头的其他位置运行ppc_4xx-g ++。使用which ppc_4xx-g++确实找到了。您还可以将-v添加到编译器调用中,以检查它正在搜索的目录。
  2. 编译器以未知方式构建不正确。迂腐地说,“ppc_4xx”甚至不是有效的目标三元组,但我不知道这是否会以你所描述的方式破坏编译。
  3. 作为最后的手段,您可以尝试--sysroot=/opt/ELDK/4.2/ppc_4xx/usr/bin

答案 1 :(得分:0)

您的包含路径不正确,并且错误清楚地表示这一点,因为每个工具链都有自己的路径,请确保更新STL等的包含路径以指向新位置。它应该解决你的问题!

答案 2 :(得分:0)

问题是因为编译器中存在错误。它无法递归搜索目录以查找包含文件夹。当我手动提供额外的包含路径时,它拒绝它说明冗余包含路径(因为它在相同的目录结构中) - 通过使用-v选项找到它。然后我创建了一个目录,创建了一个指向具有必要包含文件的目录的软链接,并在我的包含路径中包含了这个新目录(解决方法)。这很有效,我可以生成库。

例如:包含文件存在于编译器不接受的目录abc / include / xyz / include中,因为我已经指定了路径abc / include。因此,我创建了一个目录别名,并将其链接到abc / include / xyz / include。然后我将./alias包含在其中一个包含路径中并且它有效。这是一个已知的编译器问题,在以后的版本中修复,我想在4.6

中 PS:这个想法不是我的,但在网上发现了一个类似的帖子,这对我很有帮助。