Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以用X64为ARM构建gcc吗?_C++_C_Gcc_Gnu - Fatal编程技术网

C++ 我可以用X64为ARM构建gcc吗?

C++ 我可以用X64为ARM构建gcc吗?,c++,c,gcc,gnu,C++,C,Gcc,Gnu,我需要一个明确的答案,因为这对我来说还不清楚,我在文档中找不到明确的答案 假设我有一个工作的gcc工具链,其中 host x86_64-linux-gnu target x86_64-linux-gnu ,问题是我是否可以从具有的源代码中配置和构建gcc host x86_64-linux-gnu build x86_64-linux-gnu target arm-gnu-eabi 我想回答这个问题的原因是,我是否应该花时间尝试我的库的不同配置,以及用于构建gcc的脚本是

我需要一个明确的答案,因为这对我来说还不清楚,我在文档中找不到明确的答案

假设我有一个工作的
gcc
工具链,其中

host    x86_64-linux-gnu
target  x86_64-linux-gnu
,问题是我是否可以从具有的源代码中配置和构建
gcc

host    x86_64-linux-gnu
build   x86_64-linux-gnu
target  arm-gnu-eabi
我想回答这个问题的原因是,我是否应该花时间尝试我的库的不同配置,以及用于构建
gcc
的脚本是否能够进行某种隐式的阶段1构建,从而可能在这个x64上临时为我引导ARM编译器,因此,我可以为我想要的目标生成所需的工具链

“我可以用X64为ARM构建gcc吗?”

是的,你可以。我已经在一篇文章中描述了suse linux主机开发系统的这个过程

================================================================================== 我将在这里重复这些步骤:

1。确保安装了必要的标题和库

我使用了YAST的“安装软件”功能,安装了完成所有构建步骤所需的以下软件包(只需搜索软件包名称,选择并接受):


  • gmp-devel
  • mpfr-devel
  • mpc-devel
  • texinfo
  • 恩库塞斯德维尔酒店
  • termcap

2。创建目录框架



3。下载源程序包并将其解压缩

我在这里使用的是
gcc-4.7.1
,但同样的过程当然也适用于较新版本的gcc



4。构建binutils



5。构建GCC(第1部分)


--enable cxx flags configure选项还可用于控制libstdc++的生成标志(包括在此步骤中):

一般来说,在构建预期目标代码时,应该使用相同的C++编译标志。p>
6。使用交叉编译器构建GCC newlib(第2部分)


关于
--disable newlib提供的系统调用
选项的说明:
当您打算在不使用类似linux的操作系统或根本不使用操作系统的情况下为目标编译时,禁用默认的newlib syscall存根实现通常是一个好主意。它会在需要为newlib提供的未实现存根函数上留下链接器错误。 删除该选项仍将使您能够用自己的实现覆盖newlib提供的存根

但是,当您计划将交叉工具链与CMake结合使用时,应该忽略此选项。CMake使用指定的编译器定义(例如,来自toolchain.CMake文件)执行一些基本测试,如果没有提供默认存根实现,这些测试将失败


7。完成安装GCC



8。构建GDB



更新

GCC 4.8.2也同样适用。

有帮助吗?除了正常版本之外,您是否在谈论什么特别的东西?有无数种方法可以构建一个,但是如果有很多方法可以实现相同的目标,并且没有集中的文档来源,那么借助@nos等辅助工具可能会更容易:这是一个问题;因此我感到困惑。我知道crosstool ng,考虑到我的需要,我愿意自己做任何事情。@πάνταῥεῖ 看起来该指南假设给定目标的编译器已经在工作,尤其是在
gcc
之前构建
binutils
时,除了
gcc
,没有树内构建。不,这没有帮助。@user2485710“看起来该指南假设给定目标的编译器已经在工作……”不,交叉编译器是先生成的,
binutils
必须单独生成,并且无论如何都不会影响交叉编译器的生成。我在生产中使用了这些东西(针对不同的目标变体),而且效果非常好。问题:这应该与在树内构建的gcc源代码一起工作,而不是与binutils源代码一起工作吗?因为我已经尝试过这方面的东西,而且我知道一个事实是行不通的,我不知道我是做错了什么,还是我必须在单独的步骤中从树中构建binutils。@user2485710"... 或者我只需要在一个单独的步骤中从树中构建binutils。好吧,我的解决方案建议在构建交叉编译器之前,在单独的步骤中构建和安装binutils。我不知道这是否真的很重要,但我怀疑in/out-of-tree参数与此有关。在我之前的步骤中,我在构建libgcc时总是出错,如果我没有记错的话,这是在第2阶段,这意味着我的大多数标志可能都是正确的,但关于体系结构和库的标志可能是错误的。我认为使用cpu的
可能会改变游戏规则,这在x64上可能是隐含的。根据您的指导,我刚刚完成了针对ARM的binutils编译,我认为这种树外构建确实会有所不同。@user2485710“我认为这种树外构建确实会有所不同”我总是觉得这些树外/树内构建术语有点古怪。我不太确定这些是什么意思。我所知道的是,我有一个源目录,在那里我要解压缩到,我有一个构建目录,在那里我要构建东西,并将工件作为源,无论我想在哪里安装它。问题是我在树构建中有问题(gcc+binutils+其他lib,所有源都在同一目录中或符号链接在同一目录中)只有在切换到ARM目标时,ARM构建可能更挑剔,需要更精确的配置才能工作,例如,我使用的是
--with arch=
,这对于类似x86的目标来说效果完全不错,但很明显
cd ~
mkdir arm-none-eabi arm-none-eabi-src
cd arm-none-eabi
mkdir src build
cd ~/arm-none-eabi-src
mkdir src build
cd ~/arm-none-eabi-src/src

wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.7.1/gcc-4.7.1.tar.bz2
wget ftp://ftp.gnu.org/gnu/binutils/binutils-2.22.tar.bz2
wget ftp://ftp.gnu.org/gnu/gdb/gdb-7.4.tar.bz2
wget ftp://sources.redhat.com/pub/newlib/newlib-1.20.0.tar.gz

tar -xf gcc-4.7.1.tar.bz2
tar -xf binutils-2.22.tar.bz2
tar -xf gdb-7.4.tar.bz2
tar -xf newlib-1.20.0.tar.gz
cd ~/arm-none-eabi-src/build
mkdir binutils-2.22
cd binutils-2.22
../../src/binutils-2.22/configure \
  --target=arm-none-eabi \
  --prefix=$HOME/arm-none-eabi \
  --with-cpu=cortex-m3 \
  --with-no-thumb-interwork \
  --with-mode=thumb
make all install
export PATH="$PATH:$HOME/arm-none-eabi/bin"
cd ~/arm-none-eabi-src/build
mkdir gcc-4.7.1
cd gcc-4.7.1
../../src/gcc-4.7.1/configure --target=arm-none-eabi \
  --prefix=$HOME/arm-none-eabi --with-cpu=cortex-m3 \
  --with-mode=thumb --disable-multilib \
  --with-no-thumb-interwork \
  --enable-languages="c,c++" --with-newlib \
  --with-headers=../../src/newlib-1.20.0/newlib/libc/include
make all-gcc install-gcc
--enable-cxx-flags='-fno-exceptions \
    -ffunction-sections -fno-omit-frame-pointer'
cd ~/arm-none-eabi-src/build
mkdir newlib-1.20.0
cd newlib-1.20.0
../../src/newlib-1.20.0/configure --target=arm-none-eabi \
  --prefix=$HOME/arm-none-eabi --disable-multilib \
  --disable-newlib-supplied-syscalls
make all install
cd ~/arm-none-eabi-src/build/gcc-4.7.1
make all install
cd ~/arm-none-eabi-src/build
mkdir gdb-7.4
cd gdb-7.4
../../src/gdb-7.4/configure --target=arm-none-eabi \
  --prefix=$HOME/arm-none-eabi
make all install