一、下载源文件
源代码文件及其版本:
binutils-2.19.tar.bz2, gcc-core-4.4.4.tar.bz2 gcc-g++-4.4.4.tar.bz2 Glibc-2.7.tar.bz2 Glibc-ports-2.7.tar.bz2 Gmp-4.2.tar.bz2 mpfr-2.4.0.tar.bz2mpc-1.0.1.tar.gz Linux-2.6.25.tar.bz2 (由于我在编译出错的过程中,根据出错的信息修改了相关的C代码,故而没有下载相应的补丁)
一般一个完整的交叉编译器涉及到多个软件,主要包括bilinguals、cc、glibc等。其中,binutils主要生成一些辅助工具;gcc是用来生成交叉编译器,主要生成arm-linux-gcc交叉编译工具,而glibc主要提供用户程序所需要的一些基本函数库。
二、建立工作目录
编译所用主机型号 fc14.i686,虚拟机选的是VM7.0,Linux发行版选的是Fedora9,
第一次编译时用的是root用户(第二次用一般用户yyz), 所有的工作目录都在/home/yyz/cross下面建立完成,首先在/home/yyz目录下建立cross目录,然后进入工作目录,查看当前目录。命令如下:
创建工具链文件夹:
[root@localhost cross]# mkdir embedded-toolchains
下面在此文件夹下建立如下几个目录:
setup-dir:存放下载的压缩包;
src-dir:存放binutils、gcc、glibc解压之后的源文件;
Kernel:存放内核文件,对内核的配置和编译工作也在此完成;
build-dir :编译src-dir下面的源文件,这是GNU推荐的源文件目录与编译目录分离的做法;
tool-chain:交叉编译工具链的安装位;
program:存放编写程序;
doc:说明文档和脚本文件;
下面建立目录,并拷贝源文件。
[root@localhost cross] #cd embedded- toolchains
[root@localhost embedded- toolchains] #mkdir setup-dir src-dir kernel build-dir tool-chain program doc
[root@localhost embedded- toolchains] #ls
build-dir doc kernel program setup-dir src-dir tool-chain
[root@localhost embedded- toolchains] #cd setup-dir
拷贝源文件:
这里我们采用直接拷贝源文件的方法,首先应该修改setup-dir的权限
[root@localhost embedded- toolchains] #chmod 777 setup-dir
然后直接拷贝/home/yyz目录下的源文件到setup-dir目录中,如下图:
建立编译目录:
[root@localhost setup-dir] #cd ../build-dir
[root@localhost build -dir] #mkdir build-binutils build-gcc build-glibc
三、输出环境变量
输出如下的环境变量方便我们编译。
为简化操作过程。下面就建立shell命令脚本environment-variables:
[root@localhost build -dir] #cd ../doc
[root@localhost doc] #mkdir scripts
[root@localhost doc] #cd scripts
用编辑器vi编辑环境变量脚本envionment-variables:[root@localhost scripts]
#vi envionment-variables
export PRJROOT=/home/yyz/cross/embedded-toolchains
export TARGET=arm-linux
export PREFIX=$PRJROOT/tool-chain
export TARGET_PREFIX=$PREFIX/$TARGET
export PATH=$PREFIX/bin:$PATH
截图如下:
执行如下语句使环境变量生效:
[root@localhost scripts]# source ./environment-variables
四、建立二进制工具(binutils)
下面将分步介绍安装binutils-2.19.1的过程。
[root@localhost script] # cd $PRJROOT/src-dir
[root@localhost src-dir] # tar jxvf ../setup-dir/binutils-2.19.1.tar.bz2
[root@localhost src-dir] # cd $PRJROOT/build-dir/build-binutils
创建Makefile:
[root@localhost build-binutils] #../../src-dir/binutils-2.19.1/configure --target=$TARGET --prefix=$PREFIX
在build-binutils目录下面生成Makefile文件,然后执行make,make install,此过程比较缓慢,大约需要一个15分钟左右。完成后可以在$PREFIX/bin下面看到我们的新的binutil。
输入如下命令
[root@localhost build-binutils]#ls $PREFIX/bin
② GCC编译的4个阶段
GCC,即GNU Compiler Collection,是GNU项目开发的一种编程语言编译器。旨在为GNU操作系统提供一套编译器,现已成为类Unix操作系统(包括Linux、BSD、MacOS X等)的标准编译器,甚至在Windows系统上亦可使用。
GCC编译过程由四个阶段组成:预处理、编译、汇编和链接。接下来,让我们逐一探索。
考虑一个名为hello.c的源文件。
阶段一:预处理
预处理阶段主要负责处理程序中的#开头的指令,包括头文件、宏定义和注释。在Linux环境下执行命令后,可以查看到生成的hello.i文件中包含了预处理后的部分。
阶段二:编译
编译阶段将C/C++源代码转换为汇编语言。执行Linux命令后,可看到hello.s文件内容已转换为汇编代码。
阶段三:汇编
汇编阶段将汇编语言转化为机器可读的二进制代码。执行Linux命令后,hello.o文件内的内容就是汇编后的结果。
阶段四:链接
链接阶段将生成的hello.o文件组装成可执行文件。在Linux环境下执行命令后,可看到程序已成功生成并打印出结果。
若想简化整个编译流程,只需执行单一命令即可完成上述四个阶段的操作。
③ Linux Centos7.8.2003系统离线GCC源码编译升级
Linux Centos7.8.2003系统离线GCC源码编译升级的步骤如下:
准备环境:
下载GCC源码:
安装编译依赖:
解压并配置GCC源码:
创建编译目录并编译:
编译成功后的处理:
注意事项: 离线编译过程中,确保所有依赖库都已正确安装,并按照依赖顺序进行编译。 编译时间可能因机器性能而异,但通常可以在十几分钟内完成。 在升级GCC后,建议验证新版本的正确性,以确保系统稳定性。
④ 源码编译 gcc 12
最近对于C++20协程的研究促使我决定更新gcc到最新稳定版本12.1.0。首先,从gcc官网下载了gcc-12.1.0.tar.xz的安装包,通过`tar xf gcc-12.1.0.tar.xz`命令解压。
接下来,进入解压后的目录,执行`./contrib/download_prerequisites`脚本来自动下载所需的依赖项,确保编译环境准备就绪。
然后,开始编译过程,通过`./configure`命令,并设置编译选项,如`--prefix=/home/lingzhang/gcc121`指定安装路径,`--enable-bootstrap`启用自举编译,`--enable-languages=c,c++`启用C和C++语言支持,`--enable-threads=posix`选择POSIX线程模型,`--enable-checking=release`开启检查以确保质量,`--disable-multilib`禁用多库支持,`--with-system-zlib`使用系统级的zlib库。执行`make`命令开始编译,接着`make install`进行安装。
为了方便后续使用,创建了一个名为gcc121.env的环境变量文件,内容为设置环境变量。通过`source gcc121.env`来激活这个环境变量,确保gcc12.1的正确使用。
最后,验证安装的gcc版本,通过`gcc -v`命令,显示的版本信息确认为12.1,至此,gcc 12.1.0的编译和环境设置已完成。
⑤ GCC 源码编译安装
前言
本文主要介绍如何在特定条件下,通过源码编译安装GCC(GNU Compiler Collection)4.8.5版本。在Linux环境下,特别是遇到较老工程代码和低版本GCC适配问题时,网络仓库不可用,可通过下载源码进行本地编译安装。文章总结了该过程的步骤,以期帮助读者解决类似需求。
Linux系统版本:SUSE Linux Enterprise Server 12 SP5 (aarch64) - Kernel \r (\l)
GCC版本:gcc-4.8.5
步骤如下:
1,源码下载
直接在Linux终端执行:wget ftp.gnu.org/gnu/gcc/gcc...
或手动下载:ftp://gcc.gnu.org/pub/gcc/infrastructure
选取对应的gcc版本下载。
2,解压并进入目录
解压下载的tar包:tar -jxvf gcc-4.8.5.tar.bz2
进入解压后的目录:cd gcc-4.8.5
3,配置依赖库
联网情况下:cd gcc-4.8.5/
./contrib/download_prerequisites
无法联网时,手动下载依赖库(如mpfr、gmp、mpc)并上传到指定目录,然后分别解压、重命名并链接。
4,创建编译存放目录
在gcc-4.8.5目录下执行:mkdir gcc-build-4.8.5
5,生成Makefile文件
cd gcc-build-4.8.5
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
推荐配置时,根据环境调整参数,如X86_64环境下的`--disable-libsanitizer`。
6,执行编译
make(可能耗时较长)
解决可能出现的问题,如libc_name_p和struct ucontext uc,通过参考gcc.gnu.org/git或直接覆盖相关文件。
7,安装GCC
在gcc-build-4.8.5目录下执行:make install
安装完成后,可直接解压并安装。
8,配置环境变量
执行命令:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/gcc-4.8.5/mpc:/root/gcc-4.8.5/gmp:/root/gcc-4.8.5/mpfr
确保路径一致,执行 source /etc/profile 使环境变量生效。
9,检查安装情况
通过`gcc -v`和`g++ -v`验证GCC版本。
10,库升级
遇到动态库未找到问题时,需升级gcc库,通过查找和替换最新库文件解决。
11,卸载系统自带的gcc
以root用户执行:rpm -qa |grep gcc | xargs rpm -e --nodeps
12,修改ld.so.conf文件
编辑文件:vi /etc/ld.so.conf,在最下面添加实际路径,如/usr/local/lib和/usr/local/lib64。
执行 ldconfig /etc/ld.so.conf。
13,修改GCC链接
确保GCC及其相关工具的正确链接,使用`ll /usr/bin/gcc*`和`ll /usr/bin/g++*`检查链接结果。
至此,GCC源码编译安装流程完成,可满足特定环境下的GCC版本需求。
⑥ GCC编译的4个阶段
GCC编译的4个阶段分别是:
1. 预处理阶段 主要负责处理程序中的#开头的指令,如头文件包含、宏定义和注释的展开。 生成的文件通常带有.i后缀,例如hello.i,该文件包含了预处理后的代码。
2. 编译阶段 将C/C++源代码转换为汇编语言。 生成的文件通常带有.s后缀,例如hello.s,该文件包含了转换后的汇编代码。
3. 汇编阶段 将汇编语言转化为机器可读的二进制代码,也称为目标代码。 生成的文件通常带有.o后缀,例如hello.o,该文件包含了汇编后的二进制代码。
4. 链接阶段 将多个目标文件和库文件链接在一起,生成最终的可执行文件。 链接完成后,会生成一个可执行文件,该文件可以直接在操作系统上运行。
⑦ Linux 基础学习1:GCC 基本工作流程
GCC的基本工作流程包括预处理、编译、链接三个步骤。
1. 预处理 GCC首先会对源代码进行预处理。这一步骤主要处理源代码中的宏定义、文件包含等预处理指令。预处理后的结果通常是一个中间文件,但也可以通过GCC的E选项直接输出预处理结果,而不进行后续的编译和链接。
2. 编译 经过预处理后的代码会进入编译阶段。在这一阶段,GCC会对源代码进行词法分析、语法分析,并最终生成汇编代码。汇编代码是机器码的中间表示形式,它包含了程序执行所需的所有指令。
3. 链接 编译生成的汇编代码会经过汇编器转换为目标文件,这些目标文件包含了程序的机器码,但通常还包含一些未解决的符号引用。链接器的作用就是将这些目标文件以及所需的库文件链接在一起,解决符号引用,最终生成一个可执行文件。
此外,GCC编译过程中还有一些常用参数,如O选项用于优化编译,提高程序的执行效率。掌握这些参数的使用,可以进一步提高编程和调试的效率。