【Linux学习】菜鸟入门——gcc与g++简要使用

一、gcc/g++

  gcc/g++是编译器,gccGCC(GUN Compiler Collection,GUN编译器集合)中的C编译器g++是GCC中的C++编译器。使用g++编译文件时会自动链接STL标准库,而gcc不会自动链接STL标准库。下面简单介绍一下Linux环境下(Windows差别不大),程序翻译的过程:

1.1 预处理(头文件展开,条件编译,宏替换,去注释等)

gcc -E filename.c -o filename.o

其中, -E 从现在开始进行程序的翻译,预处理做完,就停下来。

1.2 编译(C/C++语言 --> 汇编语言)

gcc -S filename.c
//默认生成filename.s文件
gcc -S filename.c -o filename.s
//亦可以
gcc -S filename.i
gcc -S filename.i -o filename.s

其中,参数 -S 从现在开始进行程序的翻译,当编译做完,就停下来。下图为程序预处理编译过程中形成的目标文件test.i与test.s。

image-20230302165934759

1.3 汇编(汇编 --> 可重定位目标二进制文件,不可以被执行的,bin.obj)

简单来说,汇编的具体功能,就是把我们自己的代码进行翻译形成二进制目标文件。

gcc -c filename.s
gcc -c filename.s -o filename.o

其中, -c 从现在开始进行程序的翻译,当汇编做完就停下来。

1.4 链接(将我们自己形成的.obj文件和库文件某种合并,形成可执行程序)

gcc filename.o -o filename//可自定义输出的文件名
gcc -o filename filename.o//亦可以

其中,-o 后面是指定生成的可执行程序的名称

二、链接

  指令ldd能够检测当前被形成的可执行程序都依赖哪些库:

ldd 可执行程序名

image-20230302165338328

为什么我们能够在Linux下进行C/C++代码的编写和编译?这是因为Linux系统默认已经携带了语言级别的头文件和语言对应的。centos中,头文件一般在/usr/include/路径下:

image-20230302170319292

此外,库本质上也是文件,其分为两种:静态库和动态库;

​ 静态库:lib开头+库名+.a结尾;

​ 例如libXXXXXXX.a

​ 动态库:lib开头+库名+.so结尾;

​ 例如libXXXXXXX.so

  为了更直观地讲述静态/动态库名,进行了ldd指令检测当前可执行程序使用的依赖库,下图中,m-2.17为动态库名。Linux的指令相当一部分是用C语言编写的,因而指令就是程序、工具。

image-20230302171030807

image-20230302171307192

动静态库的小结

库分为静态库(专门让编译器,对用户的程序进行静态链接的)和动态库(专门让编译器,对用户的程序进行动态链接的);

静态库和静态链接:链接的时候,如果是静态链接,找到静态库,拷贝静态库中的我们所需要的代码到自己的可执行程序中;

动态库和动态链接:链接的时候,如果是动态链接,找到动态库,拷贝动态库中我们所需要的代码的地址到自己的可执行程序中相关的位置;

静态链接成功:我们的程序,不依赖任何库,自己就可以独立运行;

动态链接成功:我们的程序,还是依赖动态库,一旦动态库缺失,我们的程序便无法运行;

静态库,因为自身拷贝的问题,比较浪费空间;

动态库,亦是共享库,因为可以做到被大家共享方法,所以真正的实现永远都在库中,程序内部只有地址,比较节省空间;

注意:Linux默认使用的是动态链接和动态库

image-20230303124142208

  上图中,通过file test.cpp可以确认test.cpp是一个C++代码,亦是一个文本类文件;file mytestELF可执行程序,64-bit LSB executable表示64位的可执行程序,dynamically linked动态共享连接。

image-20230303130351494

  上图中,在使用静态库编译test.cpp时,出现了无法找到静态库的故障,这是因为Linux系统中,默认没有安装静态库,需要用户自行安装。C++静态库的安装指令:

sudo yum install glibc-static libstdc++-static -y

  下图中,使用动态库生成的可执行程序myfile占用9064bit,使用静态库生成的可执行程序myfile-static明显比动态库生成的可执行程序占用空间大得多。

image-20230303133433150

使用file指令能够直接看出可执行程序myfile-static使用了静态库进行程序的链接。

image-20230303133656665

三、自动化构建工具make/Makefile

  在Linux中编写一个程序,每次编译时都需要一行一行地敲命令,对于小程序还好,而对大型程序就不是很友好,不但浪费时间还会输入命令错误。面对这些情况,Linux提供了make命令和makefile文件来解决这类问题。make是一个命令,makefile是一个文件且其位于当前源代码路径下。

3.1 案例

  在test_03_02目录下,创建myfile.cc的C++文件,以及Makefile文件:

image-20230303141252956

下图为Makefile文件中的内容,其中myfile是形成可执行程序的目标文件,它需要依赖myfile.c文件。

image-20230303141126311

make命令,自动在当前路径下查找Makefile文件,执行文件中内置好的命令。

image-20230303141345348

3.2 规则

makefile是一个围绕依赖关系和依赖方法构建的一个自动化编译的工具,包含了依赖关系和依赖方法:

image-20230303142130860

注意:依赖关系中,目标文件对应的依赖文件列表可以空

直接使用make命令进行自动化编译,生成了myfile.i、myfile.s、myfile.o和myfile这四个文件。

image-20230303150715942

文件有生成必然就有清理,make依然提供清理的能力:

image-20230303150600200

  使用了make指令后,继续使用make编译时却不被允许,而make clean却可以多次执行,这是因为清理使用了.PHONY进行了欺骗,make的过程也可以。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yN2GfUxa-1677849319595)(https://gitee.com/joes_ju/personal_images/raw/master/img/202303031530148.png)]

.PHONY:目标文件
//总是被执行的

导致使用make命令后不能继续使用make命令,是由于源代码文件myfile.cc的修改时间早于目标文件myfile的修改时间,因此myfile比myfile.cc新,不需要再执行编译。

image-20230303153137493

对于这种现象,除了使用.PHONY欺骗外,亦可通过touch一个已经存在的文件,其作用是更新该文件的修改时间:

image-20230303153545563

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux离线安装GCC和G++的步骤如下: 1. 下载GCC和G++的源代码包,可以从官方网站或镜像站点下载。 2. 解压源代码包,进入解压后的目录。 3. 执行configure命令,生成Makefile文件。命令格式为:./configure --prefix=/usr/local/gcc --disable-multilib。 4. 执行make命令,编译源代码。命令格式为:make -j4。 5. 执行make install命令,安装GCC和G++。命令格式为:make install。 6. 配置环境变量,将GCC和G++的路径添加到PATH环境变量中。可以在/etc/profile文件中添加以下内容: export PATH=/usr/local/gcc/bin:$PATH 7. 验证安装是否成功,执行gcc -v和g++ -v命令,查看版本信息。 以上就是Linux离线安装GCC和G++的步骤。 ### 回答2: Linux是一款开源的操作系统,因为其完备的开发工具和庞大的用户群体,它成为了众多开发者的首选。在Linux系统中,gcc和g这两个工具的安装是非常重要的,因为它们是编译和连接程序所必须的。如果你的系统没有连接到互联网,那么你需要进行离线安装。下面是一些步骤,帮助你离线安装gcc和g。 1. 获取安装包 首先需要获取gcc和g的安装包。通常,这些安装包可以从你的Linux发行版的仓库中获得。如果你无法通过互联网获取,你就需要从其他的渠道获取,例如从朋友的电脑或通过移动设备。安装包需要下载并存储在本地。 2. 安装前依赖 在Linux中,一些软件包的安装需要先安装其他的软件包或库,这些依赖的软件包需要在安装前安装。你需要检查你的Linux发行版提供了哪些依赖的软件包,然后将它们逐一地安装。 3. 安装gcc和g 下载好所有的依赖包之后,接下来就需要安装gcc和g了。在终端中,输入以下命令来安装gcc和g: ``` tar -xf gcc_版本号.tar.gz cd gcc_版本号 ./configure --prefix=/usr/local/gcc make make install ``` 以上命令解释: - tar命令解压缩安装包 - cd命令 进入gcc的目录下 - ./configure是运行configure脚本,用于检测系统环境。--prefix选项指定了安装的目录,在这里是/usr/local/gcc。 - make命令用于编译 - make install 用于安装 4. 配置环境变量 在安装完成后,需要设置环境变量,以便系统中任何地方都可以使用gcc和g。在终端中输入以下命令行: ``` echo "export PATH=/usr/local/gcc/bin:$PATH" >> ~/.bashrc source ~/.bashrc ``` 以上命令解释: - echo "export PATH=/usr/local/gcc/bin:$PATH" >> ~/.bashrc,该命令用来将路径/usr/local/gcc/bin加入环境变量中 - source ~/.bashrc 是用于读取.bashrc文件的变动,如果不这样做,改变环境变量是不起作用的。 这些步骤完成后,你的系统中就已经成功安装了gcc和g,你可以在终端中输入gcc或g的命令来验证安装是否成功了。如果你的系统不能连接到互联网,现在已经可以使用gcc和g来编译程序了。 ### 回答3: Linux是一种常用的操作系统,在开发过程中,经常需要使用gcc编译器和g++编译器来进行代码的编译和构建。但是在某些情况下,我们可能需要在没有网络连接的情况下安装这些工具。下面介绍一下在Linux系统中离线安装gcc和g++编译器的方法。 首先,我们需要准备好gcc和g++编译器版本的安装文件,可以从官方网站或者镜像网站下载对应版本的安装文件。下载完成后,将安装文件传输到Linux系统中,放在一个目录下,例如/opt/gcc。 接下来,我们需要安装依赖库和工具包。在Linux系统中,gcc和g++编译器需要依赖一些库和工具包,比如binutils、libmpc、libmpfr、libgmp、mpc-devel、mpfr-devel和gmp-devel等。在没有网络连接的情况下,我们需要手动安装这些依赖库和工具包。 通过以下命令安装依赖库和工具包: yum install -y gcc gcc-c++ binutils libmpc libmpfr libgmp mpc-devel mpfr-devel gmp-devel 安装完成后,我们可以开始离线安装gcc和g++编译器。 通过以下命令进入/opt/gcc目录: cd /opt/gcc 解压安装文件: tar -zxvf gcc-XX.X.tar.gz 进入解压后的目录: cd gcc-XX.X 创建一个目录,用于编译安装: mkdir build 进入build目录: cd build 通过以下命令配置并编译: ../configure --prefix=/opt/gcc --disable-multilib --enable-languages=c,c++ make make install 这个过程可能需要花费比较长的时间,具体时间取决于系统硬件配置和编译器版本。安装完成后,我们可以通过以下命令查看gcc和g++编译器版本: /opt/gcc/bin/gcc -v /opt/gcc/bin/g++ -v 至此,我们已经完成了Linux系统中离线安装gcc和g++编译器的过程。在没有网络连接的情况下,我们可以通过手动安装依赖库和工具包,并下载安装文件进行安装,来使用这些工具进行代码编译和构建。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值