Linux下的C编程:gcc编译学习笔记_linux gccsource编译_第六帅的博客-程序员宅基地

技术标签: Linux  编译  gcc  

什么是gcc

Linux环境下的一个C/C++编译器

编译过程

  • 预处理:展开宏定义;处理库文件;处理条件编译;删除注释等
    gcc -E source.c -o rename.i (一般使用的命令)
    gcc -E -C source.c -o rename.i(加入选项-C,阻止删除注释)
    gcc -E source.c -o rename.i -D CONVERT (选项-D可加入宏定义,搭配 ifdef 可实现调试等功能)
    预处理后的文件是可显示的文本文件
  • 编译:高级语言–>汇编语言
    gcc -S source.c(.i) -o rename.s
    C编译器在具体的翻译之前,会先对源程序进行词法分析、语法分析、语义分析,根据分析的结果进行代码优化、储存分配
  • 汇编:汇编语言–>机器语言
    gcc -c source.c(.s) -o rename.o
    把汇编生成的机器语言目标代码文件称为可重定位目标文件
  • 链接:生成可执行文件
    gcc source.c(.o) -o rename
    在链接阶段加入参数-l、-L、-I可以链接需要用到的库文件、头文件
  • 参数-l: 指定要链接的库,比如要链接数学库,则加入参数-lm,因为数学库文件的全名是libm.so,去掉前缀lib和后缀.so就是库名m,其他库同理。
  • 参数-L:在/lib/usr/lib/usr/local/lib三个目录下的库文件可以直接使用-l命令连接,对于其他的库文件,需要用-L去指定所在目录,如:-L/xx/yy -lhello这个命令可以链接位于/xx/yy目录下的libhello.so库
  • 参数-I: 指定头文件所在目录,适用于源文件和头文件不在同一个目录下

注:上面用到的 -S、-c 等命令不仅仅能表示单个过程,如果使用命令:gcc -c source.c -o rename.o 表示的是预处理、编译、汇编,但不链接,生成 .o 文件。

多文件编译

适用于含有自己编写的头文件等情况

  • 如果结构比较简单,直接编译即可:gcc source1.c source2.c -o prog (也可以使用通配符*.c)
  • 为了免去修改一个文件都要重新编译所有文件的消耗,可以分别将每一个 .c 源文件用 -c命令 编译为.o文件,最后再进行链接
  • 编写makefile文件

编写Makefile

通过编写Makefile文件规定编译的过程和规则

  • 基本格式:
target1:requires
	command1
target2:requires
	command2
	......
operator:
    command

target是要生成的目标文件,requires是生成target所需的依赖文件。第一个target是最终的目标文件。operator是自定义的操作,常见的是clean命令,用于清理中间文件。

clean:
	rm *.o *.s
  • 通过make命令调用Makefile文件,make + 命令 调用自定义的命令
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidu_41743195/article/details/89290258

智能推荐

idea使用过程中遇到问题集_风zi的博客-程序员宅基地

1.解决idea不检查语法错误问题https://blog.csdn.net/weizheng1000/article/details/533939102.Cannot find JRE ‘1.8 (2)’. You can specify JRE to run maven goals in Settings | Maven | Runnerhttps://blog.csdn.net/qq_...

Design patterns---Behavioral patterns-程序员宅基地

Behavioral patterns are concerned with algorithms and the assignment of responsibilities between objects.

教你Maven打包插件:如何把依赖包打包到lib,依赖包打包到jar中?_微服务接口api包怎么把依赖打包到lib_柒嘴八舌的博客-程序员宅基地

<!--打包插件,jar包和依赖包分开,依赖包打包到lib下 测试可行--><plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.6</version> <configuration> ._微服务接口api包怎么把依赖打包到lib

Sun 公司宣布即将推出 UltraSparc IV+ 芯片_sunturalux_zcatlinux的博客-程序员宅基地

【赛迪网讯】Sun 微系统公司宣布即将推出 UltraSparc IV+ 芯片。基于 IV+ 芯片服务器的运行速度接近 UltraSparc IV 服务器的两倍。新芯片的代号为“ Panther ”,Sun 将于周二详细披露有关该款高端处理器的细节。   与当前的 UltraSparc IV 芯片一样,UltraSparc IV+ 在同一块基片植入两个内核,但不同之处是其制作工艺更为精细,保证了更_sunturalux

时间区间的操作:mongoose的aggregate无法match,但是find却可以找到。(非ObjecetID)_Hijiao的博客-程序员宅基地

前段时间遇到的问题,在cnode上求助https://cnodejs.org/topic/5582a4bb395a0c1812f183ea 最后自己解决了,详情如下:var getCustomerSourceListFromDataToData = function (accountid, startDate, endDate, callback) {if (!startDate) {//启始时

华为设备linux ssh登录失败,华为交换机SSH登录失败原因_曾正韬的博客-程序员宅基地

解决方案SSH登录失败几种常见原因:1、配置错误,例如设备没有开启STelnet服务功能等。处理方法:参考“配置通过STelnet登录设备示例”,检查配置是否正确和完整。2、设备作为SSH服务器,协议版本号高于客户端的协议版本号,版本不一致导致SSH登录失败。处理方法:系统视图下,执行命令ssh server compatible-ssh1x enable,配置SSH服务器兼容低版本功能。缺省情况..._华为交换机ssh无法登陆

随便推点

SpringBoot相关知识笔记_springboot handlerinterceptor 需要引入什么依赖_发际线毁灭者的博客-程序员宅基地

Springboot项目的创建以及热部署1.创建时需要自己选择需要的依赖,Idea会自动生成对应的目录以及启动类.(启动类要和其他包同一级,否则会导致找不到资源)2.springboot的在idea中的热部署【File】——【Settings…】——【Build,Execution,Deployment】——【Compiler】,勾选"Build project automatically..._springboot handlerinterceptor 需要引入什么依赖

【Delphi入门】网络服务5(UDP 协议 & NMUDP组件)_delphi nmudp_根号二点五的博客-程序员宅基地

UDP 协议UDP是称做用户报文协议,是User DataGram Protocol的缩写,在因特网上使用非常广泛的一种通信协议,他是网络七层模型中传输层的协议之一与TCP协议最大区别在于,UDP是面向无连接的协议,他传送的数据包是独立的,没有先后关系,也没有确认机制,只对报文头标和数据区作简单的校验。因此,该协议不能保证数据传输的可靠性,但在网络质量较好的环境下传输效率很高NMUDP 组件在DELPHI6,位于Fastnet面板上的NMUDP组件封装了UDP协议,程序员可以不用详细的了解该协议,就_delphi nmudp

Matlab 调用opencv函数_matlab调用opencv函数-程序员宅基地

Matlab 调用opencv函数前期准备例子前期准备使用matlab2018a和vs2015(先安装),网上一般将mex -setup作为第一步。首先在matlab命令行窗口(不需要考虑文件路径)输入mex –setup。出现这里是警告,可以忽略。网上有的博客说,MATLAB和vs安装的先后顺序将影响使用,通过下面方法https://blog.csdn.net/xiamentingtao..._matlab调用opencv函数

滴答清单Windows去会员版_滴答清单不付费能用吗_自己学习记录用,内容仅对自己有效的博客-程序员宅基地

滴答清单去会员版安装后发现其实就是之前的版本,不是最新版,使用起来有点别扭,又卸载掉,换成试用版本了,如果14天试用合适,就买个会员吧。滴答清单低版本百度网盘链接: https://pan.baidu.com/s/1YcP9Od2_oFp3vS_VZvbi2A 提取码: 46yg..._滴答清单不付费能用吗

Linux redhat 6、7/cenos 6、7 mysql5.7.18 rpm安装_zhangqifeng92的博客-程序员宅基地

一、准备其实rpm安装是比较省事儿的,直接在官网上下载mysql的rpm版本,下载地址如下:https://dev.mysql.com/downloads/mysql/,如下图所示选择对应的版本二、.卸载1.检查安装过的mysql rpm文件rpm -qa | grep -i mysql2.卸载安装过的mysql rpm文件rpm -ev mysql-* -

Caché 开发(一)~M程序编写_chengxi2031的博客-程序员宅基地

一、M语言基础 1.常用的特殊变量 这些特殊的变量有指定的含义,它们一般以$开头。有个别特殊变量,也同时支持缩写。 1)、$HOROLOG ($H) $Horolog 包含了时间和日期,它们由逗号分开。第一部分是日期的 数字,它是从1840 年12 月31 日...

推荐文章

热门文章

相关标签