【问题标题】:How to I get crosstool-ng C++ compiler working如何让 crosstool-ng C++ 编译器工作
【发布时间】:2012-10-18 15:16:15
【问题描述】:

我正在尝试让 crosstool-ng 同时使用 C 和 C++。即使我在使用 menuconfig 时选择了 C++,但它似乎并没有构建。 gcc 编译器按预期工作,但 g++ 没有

我不确定我做错了什么,因此我们将不胜感激。

我按照此处找到的步骤操作: Building embedded ARM systems with Crosstool-NG

$ arm-unknown-linux-gnueabi-cpp main.cpp -o test
arm-unknown-linux-gnueabi-cpp: main.cpp: C++ compiler not installed on this system

注意:在 bin 目录中找不到 arm-unknown-linux-gnueabi-g++。 我试过跨工具版本 1.16.0 和 1.15.3

arm-unknown-linux-gnueabi-cpp -v
Using built-in specs.
Target: arm-unknown-linux-gnueabi
Configured with: /opt/crossArm/.build/src/gcc-4.3.2/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --target=arm-unknown-linux-gnueabi --prefix=/opt/crossArm/.build/arm-unknown-linux-gnueabi/buildtools --with-local-prefix=/home/jgarvin/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot --disable-libmudflap --with-sysroot=/home/jgarvin/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot --enable-shared --with-pkgversion='crosstool-NG 1.16.0' --with-float=soft --enable-__cxa_atexit --with-gmp=/opt/crossArm/.build/arm-unknown-linux-gnueabi/buildtools --with-mpfr=/opt/crossArm/.build/arm-unknown-linux-gnueabi/buildtools --enable-target-optspace --disable-libgomp --disable-libmudflap --disable-nls --disable-multilib --enable-languages=c
Thread model: posix
gcc version 4.3.2 (crosstool-NG 1.16.0)

代码

#include<iostream>

using namespace std;

int main(){
   cout<<"Hello World"<<endl;
return 0;
}

在我的 build.log 文件中,我看到 C++ 选项已打开

[DEBUG]    CT_CC_SUPPORT_CXX=y

我在config.log也看到了:

configure:3030: $? = 0
configure:3019: gcc -v >&5
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6/lto-wrapper
Target: i686-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu

【问题讨论】:

  • --enable-languages=c 是重点,试着把它放到 c,c++ 中,它会(尝试)构建 c++ 编译器。
  • 是的,我看到“..尝试将其转换为 c,c++..”我的问题如何。我在 menuconfig 中选择了 C++。
  • 我不知道 crosstool-ng 是如何工作的,但您可以从调用此配置行的位置开始跟踪脚本。或者您可以尝试通过它查找“--enable-languages”

标签: c++ linux arm cross-platform crosstool-ng


【解决方案1】:

发件人,http://briolidz.wordpress.com/2012/02/07/building-embedded-arm-systems-with-crosstool-ng/

通过运行 menuconfig 界面优化您的配置:

$ ./ct-ng 菜单配置

在此步骤中,导航到 C 编译器 菜单。然后可以选择C++或者取消选择JavaFortran等。由于crosstool-ng只是一个一堆脚本和补丁文件,开发版本很少会破坏东西。您始终可以从 hg 存储库中提取。

hg 克隆http://crosstool-ng.org/hg/crosstool-ng
cd crosstool-ng
./bootstrap
制作
sudo 安装

这将有最新的修复。我已经多次使用这种方法构建了支持 C++ 的 arm 交叉编译器 [包括来自 x86_64 主机的 Mingw 和 i386 的 加拿大交叉]。

编辑:我看到 wordpress 链接建议在本地安装 ct-ng。上面的命令进行了完整的安装,把东西放在 /usr/local 中。此外,似乎 OP 确实尝试设置 menuconfig 的 C++ 选项。尝试更改 sjlj 值,使用最新版本的 ct-ng 并安装它。这为我在 Ubuntu 上生成了一个 ARM Linux C++ 交叉编译器。 build.log 输出有助于确定 ct-ng 是否决定某些配置是不可能的。

最后,邮件列表 crossgcc@sourceware.org 不需要订阅 afaik。 http://sourceware.org/ml/crossgcc/ 的档案可能会有所帮助。如果您仍有问题,我相信邮件列表中的某个人将能够为您提供帮助。

编辑:安装最新的ct-ng试试,

$ ct-ng arm-cortex_a15-linux-gnueabi #Alternate arm-yem-linux-gnueabi
$ ct-ng menuconfig # 调整您的处理器、gcc 版本等。
$ ct-ng build # 去喝杯咖啡(或者干点别的)。

抱歉,您的主机编译器是使用 Linaro 制作的。我对你的编辑读得太多了。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题。原来我在.build 下查看错误的bin 目录。工具链的最终版本安装在~/x-tools 下...

    【讨论】:

      【解决方案3】:

      如果你还在寻找ARM平台上编译c++的答案:

      安装crosstool-ng:

      tar xjf <ct-ng archive>
      cd crosstool-ng-<numversion>
      # reset of LD_LIBRARY_PATH is required to avoid issues with crosstool-ng
      unset LD_LIBRARY_PATH
      ./configure prefix=<installDir>
      #example ./configure prefix=/opt/cross-rpi
      make
      make install
      #required to make sure you get the right on in case
      export PATH=<installDir>/bin:$PATH
      #check what version is on now.
      which ct-ng
      

      现在创建并启动配置:

      mkdir chain-build #the directory hosting the build files of your cross compil chain
      cd chain-build
      ct-ng menuconfig
      

      设置选项与 arm 平台相关:

      路径和其他选项

      • 配置最大日志级别以查看 WARN 而不是 INFO,这会使日志完全混乱,并且在我看来使它们难以使用,对于常用用例。

      目标选项操作系统

      • 目标架构

        • 手臂
      • 系统

        • Linux

      二进制实用程序 - 选择最新版本的binutils

      C 编译器

      • GCC : 选择 Show linaro Versions 然后选择最新的 linaro gcc(根据经验,比非 linaro 更稳定)

      • C++:检查一下

      现在构建你的工具链

      ct-ng build
      # once done check the content of the bin dir
      ls <yourChainInstallDir>/x-tools/arm-unknown-linux-gnueabi/bin
      

      你应该得到这样的东西:

      要编译 c++ 代码,您应该只需要 g++。要检查 g++ (for arm) 是否正常工作,请键入

      arm-unknown-linux-gnueabi-g++ -v
      

      你应该得到类似这样的东西:

      Using built-in specs.
      COLLECT_GCC=x-tools/arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-g++
      COLLECT_LTO_WRAPPER=/opt/cross1.19/x-tools/arm-unknown-linux-gnueabi/libexec/gcc/arm-        unknown-linux-gnueabi/4.8.2/lto-wrapper
      Target: arm-unknown-linux-gnueabi
      [...]
      blahblah
      [...]
      gcc version 4.8.2 20130603 (prerelease) (crosstool-NG 1.19.0)
      

      收到此消息后,您应该会没事的。

      唯一需要注意的是,您是否拥有编译代码所需的所有

      例如例如在 Raspberry-pi(使用 Raspbian)上,一些库必须从 /lib/usr/lib 手动导入(然后放入您的 LD_LIBRARY_PATH 中)。

      有时 gcc 或 g++ 的包含不会复制到工具链的包含目录中(使用 crosstool-ng 时,会出现几次问题),因此您需要从 /usr/include 目录中获取包含.

      【讨论】:

        猜你喜欢
        • 2015-05-03
        • 2017-07-02
        • 1970-01-01
        • 2018-08-05
        • 2010-11-08
        • 1970-01-01
        • 2017-06-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多