如何让crosstool-ng C ++编译器工作

时间:2012-10-18 15:16:15

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

我正在努力让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

3 个答案:

答案 0 :(得分:2)

来自,http://briolidz.wordpress.com/2012/02/07/building-embedded-arm-systems-with-crosstool-ng/

  

通过运行menucon fi g界面来重新配置您的配置:

     

$ ./ct-ng menuconfig

在此步骤中,导航至 C编译器菜单。然后你可以选择 C ++ 或取消选择 Java Fortran 等等。因为 crosstool-ng 只是一个一堆脚本和补丁文件,开发构建很少破坏事物。您始终可以从 hg 存储库中提取。

  

hg clone http://crosstool-ng.org/hg/crosstool-ng   
cd crosstool-ng   
./bootstrap   
使   
sudo make install

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

编辑:我看到 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制作的。我在你的编辑中读得太多了。

答案 1 :(得分:2)

我遇到了类似的问题。事实证明我正在查看a下的错误bin目录。工具链的最终版本安装在.build下而不是......

答案 2 :(得分:0)

如果您仍在寻找关于在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平台相关:

路径和misc选项

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

目标选项操作系统

  • 目标架构

  • 系统

    • 的Linux

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

C编译器

  • 海湾合作委员会:选择显示linaro版本,然后选择最新的linaro gcc(从经验来看比非linaro更稳定)

  • C ++:检查一下 c++ check

现在构建你的工具链

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

你应该得到这样的东西: binaries

要编译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)

收到此消息后,您应该没问题。

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

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

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