makefile第三课:c语言的编译(代码片段)

爱听歌的周童鞋 爱听歌的周童鞋     2023-04-13     189

关键词:

目录

C语言的编译

前言

学习杜老师推荐的Makefile教程视频,链接。记录下个人学习笔记,仅供自己参考。

之前有转载过杜老师的从零Makefile落地算法大项目文章,感兴趣的可以看看。

本课程主要讲解通过gcc实现C语言的编译过程以及静态库和动态库文件的生成。

1.Fundamental Compiling

编译C语言相关的后缀如下

2.Comiling C

2.1 Preprocessing

# 不会生成 .i 文件
gcc -E main.c
gcc -E main.c -o helloworld.i
  • -E 选项告诉编译器只进行预处理操作
  • -o 选项把预处理的结果输出到指定文件

2.2 Generating Assembly Language

gcc -S main.c
gcc -S main.c -o xxx.s
  • -S 选项告诉编译器,进行预处理和编译成汇编语言操作

每个平台对应的汇编语言的形式是不同的,例如有很多型号的开发板,有很多型号的 CPU

2.3 Source File to Object File

gcc -c main.c
gcc -c main.c -o xxx.o
# 编译多个 .c 文件
gcc -c main.c add.c minus.c

2.4 Single Source to Executable

  • 注意:后面三个命令执行后并没有按汇编过程出现 .i .s 或 .o 文件,并不意味着没有经历这些过程
gcc main.c
gcc main.c -o xxx

执行程序

./可执行程序

2.5 Multiple Sources to Executable

gcc main.c add.c minus.c -o exec
./exec

3.Creating a Static Library

  • 编译成 .o 的文件

    gcc -c [.c] -o [自定义文件名] 
    gcc -c [.c] [.c] ...
    
  • 编译静态库

    ar -r [lib自定义库名.a] [.o] [.o] ...
    
  • 链接成可执行文件

    gcc [.c] [.a] -o [自定义输出文件名]
    gcc [.c] -o [自定义输出文件名] -l[库名] -L[库所在路径]
    

4.Creating a Shared Library

  • 编译成 .o 文件

    gcc -c -fpic [.c/.cpp][.c/.cpp]... 
    
  • 编译动态库

    gcc -shared [.o][.o]... -o [lib自定义库名.so]
    
  • 链接成可执行文件

    gcc [.c/.cpp] -o [自定义可执行文件名]  -l[库名] -L[库路径] -Wl,-rpath=[库路径]
    

5.总体概括

5.1 编译过程

源文件.c文件->预编译成.i文件->编译成汇编语言.s->汇编成.o文件->链接成可执行文件(名字自定义,后缀没关系)

5.2 编译过程命令

  • 预处理:

    gcc -E [.c源文件] -o [自定义输出文件名.i]
    
  • 编译成汇编语言(隐藏了预处理操作) :

    gcc -S [.c源文件] 
    
  • 会变成.o的object文件(二进制文件,可用于链接) :

    gcc -c [.c源文件] [.c源文件] [...] (可选选项:-o [自定文件名])
    

5.3 库

5.3.1 静态库

  • 编库(先转成.o文件,再编成lib[自定库名].a)

    gcc -c [.c源文件] [.c源文件] [...] (可选选项:-o [自定文件名])
    
    ar -r lib[自定库名].a [.o文件] [.o文件] [...]
    
  • 链接

    gcc [main文件] -o [自定义输出可执行文件名] -l[库名] -L[库的路径]
    

5.3.2 动态库

  • 编库

    • 第一种做法, 先转成.o文件,再编成.so文件

      gcc -c -fpic [.c源文件] [.c源文件] [...]
      
      gcc -shared [.o文件] [.o文件] [...] -o lib[库名].so
      
    • 第二种做法,直接转成.so

      gcc -fpic -shared [.c源文件] [.c源文件] [...] -o lib[库名].so
      
  • 链接

    gcc [main文件] -o [自定义输出可执行文件名] -l[库名] -L[库所在路径] -Wl,-rpath=[库所在路径]
    

总结

本次课程学习了c语言文件通过gcc完整的编译过程,以及通过gcc将c语言文件编译成库文件。

golang语言学习第三课条件语句(代码片段)

if 是一个条件语句。if语句的语法为:ifcondition 与其他语言不同,其他语言if后面有()括号,但是go语言是没有的。if 语句后面可以接可选的 elseif 和 else 语句:ifconditionelseifconditionelse  注意:务必在... 查看详情

makefile(代码片段)

makefile一、gccgcc是用来编译代码的编译器编译完后有一些常见的输出文件.a 静态库(文档).c 需要预处理的C语言源代码.h C语言源代码的头文件.i 经过预处理后的C语言源代码.o 目标文件(经过汇编产生).s 经过编译后产... 查看详情

django第三课模板(代码片段)

##模板在之前的章节中,视图函数只返回文本,而实际上生产环境中其实很少这样用,因为实际的页面大多数是带有样式的HTML代码,这可以让浏览器渲染出非常漂亮的页面。目前市面上有非常多的模板系统。其中最知名最好用的... 查看详情

makefile常用写法(代码片段)

这里写目录标题一、常规编译c语言语句二、初级使用Makefile1.在需要编译的项目的根目录下建立文件makefile2.打开makefile3.编写文件4.执行makefile三、进阶使用makefile1.多个c文件需要编译为一个可执行文件2.编译完成后删除所有的.o文... 查看详情

makefile常用写法(代码片段)

这里写目录标题一、常规编译c语言语句二、初级使用Makefile1.在需要编译的项目的根目录下建立文件makefile2.打开makefile3.编写文件4.执行makefile三、进阶使用makefile1.多个c文件需要编译为一个可执行文件2.编译完成后删除所有的.o文... 查看详情

python第三课(代码片段)

##函数的三种定义方式####无参函数####不需要接收外部传入的参数####deffoo():####print(‘fromfoo...‘)####foo()####有参函数####需要接收外部传入的参数(多一个不可,少一个不可)####deflogin(user,pwd):####print(user,pwd)####login(‘tank‘,‘123‘)#####... 查看详情

dev-c++中c语言的文件编译的时候自动生成makefile.win文件而且编译报错。(代码片段)

...ff1a;DEV-C++中c语言的文件编译的时候自动生成了一个makefile.win的文件而且编译器在该文件中报错,显示的error为:[Error]ldreturned1exitstatus原因分析:解决方案:关闭makefile.win,完善函数后,代码运行正常... 查看详情

scrapy学习第三课(代码片段)

python爬虫框架scrapy学习第三课利用CrawlSpider类改写成套招标数据爬取利用CrawlSpider类改写成套招标数据爬取创建一个新的项目scrapystartprojectBidsSpider新建一个利用crawlSpider的爬虫基类scrapygenspider-tcrawlpublicBidshubeibidding.com重点:scr... 查看详情

thrift第三课编写脚本

警告  尽量使用tutorial下面的模板,注意脚本的格式,否则生成错误使用thrift-0.9.0生成C++/csharp代码使用的指令如下:thrift-0.9.0.exe--gencppthriftcom.thriftthrift-0.9.0.exe--gencsharpthriftcom.thrift1注释有如下的三种方式1)// 2)/**/支持C... 查看详情

c#多线程并行编程--第三课(代码片段)

1.Thread中的一些静态方法AllocateDataSlot:无名称的槽位AllocateNamedDataSlot:有名称的槽位GetNamedDataSlot:通过槽位的名称获取LocalDataStoreSlot,在通过GetData(LocalDataStoreSlot)得到存放在的槽位的数据FreeNamedDataSlot:释放槽位的名称 &nbs... 查看详情

c语言学习第三课习题编程练习

1、通过实验的方法,观察系统如何处理整数上溢、浮点数上溢、和浮点数下溢的情况。整数上溢的情况:#include<stddio.h>int main(){ int i=2147483647;printf("%d %d %d ",i,i+1,i+2);}运行结果如下:650)this.width=650;"src="https://... 查看详情

php走进php第三课基础语法(代码片段)

【PHP】✔️走进PHP✔️第三课基础语法概述注释代码规范字符串拼接运算符判断语句循环语句while循环dowhile循环for循环概述从今天开始,小白我将带领大家一起来学习一下PHP的基础知识.注释注释(Comment)是对代码的解释和说明.在代... 查看详情

phtyon第三课

须知:应用软件是安装在系统软件上面的,应用软件的指令都应由系统软件操纵硬件进行执行。    高级语言:phtyon Java php go......低级语言:c语言 汇编语言 1.程序运行原理高级语言(字节码)/转换... 查看详情

[makefile]递归编译的makefile的实现(代码片段)

...p://www.linuxidc.com/Linux/2017-01/139702.htm 最近写了一个递归Makefile,目的是既可以实现子模块的单独编译,也可以不做任何修改就和整个程序的整体进行无缝衔接的编译。具体的思路是借助第三方文件,将子模块编译好的.o文件的... 查看详情

jsp第三课servlet常用对象(代码片段)

在Servlet技术的学习过程中,需要用到很多的常用对象,而且其用法也非常重要,这里介绍第二个常用对象,HttpServletRequest概念request对象是用于接收浏览器发送过来的请求数据。常用获得浏览器请求的方法获取浏... 查看详情

第三课文件处理和函数(代码片段)

一、文件处理:1、文件操作的必要条件:  1,打开文件,产生文件句柄。  2,操作文件句柄。  3,关闭文件。例子:护士主妇空姐老师联系方式.txt1,文件路径2,编码方式:utf-8。3,动作mode,读,读写,写读.....f1=open(... 查看详情

makefile入门教程(代码片段)

Makefile介绍make是一个命令工具,它解释Makefile中的指令(应该说是规则)。在Makefile文件中描述了整个工程所有文件的编译顺序、编译规则。Makefile有自己的书写格式、关键字、函数。像C语言有自己的格式、关键字和函数一样。... 查看详情

使用makefile编译多个c源代码的方法(代码片段)

...都需要自己手动创建,并且最好给予足够的rwx权限,这里Makefile没有自动创建目录。.|--Makefile|--debug||--Makefile||--bin||`--app|`--obj||--main.o|`--test_file_stat.o|--main.c|--test||--Make 查看详情