Linux gcc编译代码

一.gcc编译代码

1.1gcc的使用

gcc只能用来编译C语言

touch code.c 创建文件

利用vim打开

gcc code.c 编译代码,生成a.out文件

./a.out运行代码

如果有编译报错的情况,因为有的编译器可以能是版本的问题

可以在后面加上gcc code.c -std=c99

如果我不想使用编译器自己生成的可执行文件的名称该怎么办呢?

gcc code.c -o mybin.exe

把名字更改就行

二.程序翻译过程

1.1编译器

人们最开始在编译的时候是用打孔带直接给cpu输入二进制指令

但这种方式效率比较低

后来就发明汇编语言

但计算机不认识汇编语言就需要编译器来翻译

人们就用二进制写一个编译器然后把汇编语言翻译成二进制

汇编语言用着也不是很好,人们就发明了c语言,C++等等

c语言出来后就遇到一个问题

使用c语言来写一个C语言编译器还是用其他语言来写一个C语言编译器

用c语言编写编译器计算机是读不懂的,这时就用汇编语言来编写

把c语言翻译成汇编语言,汇编语言再翻译成二进制

1.2语言/编译器自举的过程

用二进制编译一个汇编编译器,再用汇编语言编译一个汇编编译器

用汇编语言编译一个c语言编译器,再用c语言编译一个c语言编译器

编译器也是软软件

1.3预处理 编译 汇编 链接

预处理:

1.头文件展开

复制头文件

-E的作用是:从现在开始帮我进行程序的翻译,等预处理做完你就停下来不要再往后执行

-o code.i将头文件展开的内容写到指定的源文件中

vim code.i进入源文件

头文件展开把stdio.h头文件内容拷贝到了源文件里

vim /etc/include/stdio.h进入头文件这里面就是

头文件展开的内容都复制到源文件里面了

编译器都有自己的默认搜索路径不用担心编译器能不能找到stdio.h头文件

2.去注释 宏替换

3.条件编译

当#define是 V1是,条件编译后的结果是普通用户

当#define是V2,条件编译后的结果是VIP

默认情况,超级VIP

通过条件编译可以实现对代码的动态裁剪

这就是为什么xshell有免费版和付费版的区别

编译:

编译原文件形成汇编语言

-S的作用的是:从现在开始进行程序的翻译,等编译工作完成就停下来

vim code.s打开汇编文件

汇编:

把汇编编程可重定位二进制文件

-c的作用是:汇编做完就停下来

vim code.o打开二进制文件

全是乱码

od.code.o查看二进制

code.o现在并不能执行

链接:

动态链接:把要链接的库中的函数地址拷贝到可执行程序的特定为止

形成的可执行程序体积比较小,节省资源,较慢,依赖动态库,动态库没有所有的依赖这个库的程序都无法运行

静态链接:把目标文件.o 和 静态库 .a ,使用 ld 链接器,链接生成一个可执行程序

默认情况下,云服务器没有安装c静态看的只有动态库sudo yum install glibc-static

  c++的静态库sudo yum install -y libstdc++static

无视库可以独立运行,体积太大,浪费资源

形成可执行

*.o+系统库 = 可执行程序

总结:1.gcc code.c -o mybin直接使用这种快捷方式

           2.-E翻译过程  S预处理过程  C编译汇编过程

                code.i 原文件  code.s汇编文件  code.o二进制文件(iso)

三.动静态库

3.1头文件

我们现在所写的所有代码都是站在巨人的肩膀上

已经有人给我们写好了对应的可以直接使用的函数

哪这些函数存放在哪里了?

我们都知道函数有个库存放在库里,哪这个库在哪呢?

头文件在Linxu系统中都有预装

ls /usr/include/查看头文件

3.2库文件

ldd查看一个可以执行程序依赖的第三方库

ldd mybin

可以看到mybin依赖库的路径/lib64/libc.so.6

ls /lib64/libc.so.6

Linux系统也提前给我们预装了库

可执行程序 = 头文件(提供方法的声明) + 库文件(提供方法的实现)

我们在第一次安装vs会选择这个选项安装c和c++安装包

这个安装包就包含了头文件库和函数库

安装下载并拷贝头文件和库文件到开发环境中的特定路径下

一定要被编译器自己找的到

库的命名

libc.so.6

以lib开头,so库的类别区分动静态库,6版本号

c表示库的名字,C标准库

库的分类

.so:动态库(.dll)

是c/c++或者其他第三方提供的所有方法的集合,被所有程序以链接的方式,关联起来

.a:静态库(.lib)

是c/c++或者其他第三方提供的所有方法的集合,被所有程序以拷贝的方式,将需要的代码

拷贝到自己的可执行程序中

3.3开发环境

1.下载开发环境include,lib

2.设置合理的查找路径

3.规定好我们形成可执行程序的链接方式

本小节完结,点个赞和关注吧!!!

  • 28
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当你在Linux使用gcc编译器时,通常需要执行以下步骤: 1. 打开终端窗口并进入要编译的源代码目录。 2. 编写一个Makefile文件,它描述了源文件之间的依赖关系以及如何编译它们。这是可选的,但对于大型项目来说,它可以使编译过程更加自动化和可靠。 3. 输入以下命令来编译代码: `gcc -o <输出文件名> <源文件1> <源文件2> ...` 这将使用gcc编译器将所有源文件编译成一个可执行文件,并将其保存在指定的输出文件名中。例如: `gcc -o myprogram main.c file1.c file2.c` 4. 如果编译过程中出现错误,gcc将会给出相应的错误信息,你需要检查错误并修复它们,然后重新编译。 这是一个基本的编译过程。当然,gcc还有许多选项和参数可供使用,可以根据需要进行调整和定制。 ### 回答2: GCC是GNU编译器集合的缩写。本质上,它是一个用于编译和链接C和C++代码编译器。GCC是开源的,可移植的,以及非常流行的编译器。由于其开源的本质,GCC在许多不同的操作系统上是通用的,包括Linux。 在Linux系统中,GCC是默认的编译器。它被包含在大多数Linux分发版中,并且它有一个Linux专用版本,称为Linux GCCGCC可以用于编译许多不同类型的代码,包括应用程序,库和驱动程序。当然,GCC最重要的特点之一是其灵活性,它可以输入许多不同的源代码文件格式,包括C,C++,Fortran,和Ada等。 GCC的安装通常随着Linux系统的安装而自动安装。如果您的Linux系统上没有安装GCC,您可以通过在终端中使用包管理器命令安装它。命令可能是: sudo apt-get install gcc GCC编译过程中首先会预处理源代码(将源文件中的预处理指令进行展开),接着是编译阶段,将源代码转换为汇编代码,然后将汇编代码转换为二进制机器代码,最后是链接阶段,将不同的模块组合在一起形成可执行文件或动态库。 GCC编译器支持大量的编译选项和参数,使其更加灵活。其中一些选项是可用于微调编译器优化,减少代码大小等。GCC也提供了许多调试选项,以便在处理编译错误和调试代码使用。 总之,作为一个开源,跨平台的编译器,GCCLinux系统中具有不可替代的地位。它是许多开发人员的首选,因为它能够在Linux系统上编译和构建各种类型的应用程序和库。 ### 回答3: GCC是GNU Compiler Collection的简称,是一个跨平台的编译器集合,被广泛地使用Linux操作系统下的应用程序开发中。 在Linux下进行程序开发,需要进行编译过程,将源代码转换成可执行文件。GCC提供了一个强大的编译器和链接器,可编译多种语言的源代码,例如C、C++、Objective-C、Fortran等,支持多种编译选项,能够满足不同开发者的需求。 在使用GCC进行编译时,首先需要安装GCC编译器。在Linux系统中,安装GCC非常简单,可以执行以下命令: sudo apt-get update sudo apt-get install gcc 上述命令会从Linux软件仓库中下载并安装GCC编译器。安装完成后,就可以开始进行编译了。 使用GCC编译一个C程序时,可以将源代码保存为.c文件,然后在终端中执行以下命令: gcc -o hello hello.c 其中,-o选项用于指定输出文件的名称,hello.c为源文件的名称。如果编译成功,会生成一个名为hello的可执行文件。 除了基本的编译命令外,GCC还提供了许多编译选项,可以用来控制编译过程,例如优化级别、警告选项等。开发者可以根据自己的需求选择合适的编译选项,以优化程序的性能和可靠性。 总之,GCC是一款功能强大的编译器,提供了丰富的编译选项,为Linux操作系统下的应用程序开发提供了良好的支持。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值