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