gcc与makefile编译 BY 四喜三顺
gcc编译控制过程:(假设源代码为a.c)
(1)源文件到预处理文件: gcc -E -o a.cxx a.c a.cxx显示调用哪些头文件
(2)生成汇编代码: gcc -S -o a.s a.c a.s显示汇编指令
(3)生成目标代码: gcc -c -o a.o a.c
(4)链接生成可执行文件: gcc a.o -o aa.out
gdb调试程序:
(1)生成可执行程序: gcc -g -o a.debug a.c
(2)终端中输入 gdb
(3)加载程序 file a.debug
(4)查看代码 list (enter一次显示10行)
(5)加入断点 break n (在第n行加入断点)
(6)查看断点 info breakpoint
(7)运行程序 run
(8)跳转到下一个断点 next
(9)查看变量i的值 print i
make与makefile编译:
(部分内容参考http://www.cnblogs.com/sunsonbaby/archive/2004/08/26/36677.html)
对于一个包括几百个源文件的应用程序,如果每次都要键入gcc命令进行编译的话,简直就是一场灾难。
使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。
make工具可自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译。
make工具最主要功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。
$ make -f Makefile.debug
例:
一个名为prog的程序由三个C源文件filea.c、fileb.c和filec.c以及库文件LS编译生成
这三个文件还分别包含自己的头文件a.h 、b.h和c.h。
假设filea.c和fileb.c都要声明用到一个名为defs的文件,但filec.c不用。
即在filea.c和fileb.c里都有这样的声明:#include "defs"
通常情况下,C编译器将会输出三个目标文件filea.o、fileb.o和filec.o。
那么下面的文档就是一个简单的makefile文件,描述了这些文件之间的相互联系:
1. #This is a example for describing makefile
2. prog : filea.o fileb.o filec.o
3. cc filea.o fileb.o filec.o -LS -o prog
4. filea.o : filea.c a.h defs
5. cc -c filea.c
6. fileb.o : fileb.c b.h defs
7. cc -c fileb.c
8. filec.o : filec.c c.h
9. cc -c filec.c
第1行字符为 # 的行为注释行。
第2行指定prog由三个目标文件filea.o、fileb.o和filec.o链接生成。
第3行描述了如何从prog所依赖的文件建立可执行文件。
第4、6、8行分别指定三个目标文件,以及它们所依赖的.c和.h文件以及defs文件。
第5、7、9行则指定了如何从目标所依赖的文件建立目标。
Makefile中允许使用简单的宏指代源文件及其相关编译信息,在引用宏时只需在变量前加$符号
值得注意的是,如果变量名的长度超过一个字符,在引用时就必须加圆括号()。
例如:
1. # Define a macro for the object files
2. OBJECTS= filea.o fileb.o filec.o
3. # Define a macro for the library file
4. LIBES= -LS
5. # use macros rewrite makefile
6. prog: $(OBJECTS)
7. cc $(OBJECTS) $(LIBES) -o prog
8. ……
此时如果执行不带参数的make命令,将连接三个目标文件和库文件LS;
但是如果在make命令后带有新的宏定义:make "LIBES= -LL -LS"
则命令行后面的宏定义将覆盖makefile文件中的宏定义。若LL也是库文件,此时make命令将连接三个目标文件以及两个库文件LS和LL
gcc与makefile比较:
(部分内容参考http://www.crazyant.net/414.html)
假如一个多文件程序包含2个C程序文件,一个文件中main函数调用另一个文件的函数display
gcc编译的过程如下:
gcc -c display.c main.c
gcc -o example display.o main.o
./example
makefile的操作如下:
进入makefile的编辑界面后,输入如下内容:
main: display.o main.o
gcc -o example display.o main.o
然后保存退出,运行make命令,example可执行文件自动创建,直接执行。
gcc与makefile编译 BY 四喜三顺的更多相关文章
- C++---初识《通过g++ / makefile 编译和调用动态库so文件》(ubuntu)
C++---初识<通过g++ / makefile 编译和调用动态库so文件>(ubuntu) ------------------------目录------------------- ...
- GCC,GDB,Makefile和IO复用函数
2015.1.22 c高级的环境搭建:GCC编译器:全称 GNU CC,是GNU工具(tool chain)的一种,源码编译成机器码,gcc的编译依赖于很多小工具4.3.3和3.4.3版本的比较稳定 ...
- 【Linux学习】 写一个简单的Makefile编译源码获取当前系统时间
打算学习一下Linux,这两天先看了一下gcc的简单用法以及makefile的写法,今天是周末,天气闷热超市,早晨突然发现住处的冰箱可以用了,于是先出去吃了点东西,然后去超市买了一坨冰棍,老冰棍居多, ...
- Linux Makefile 编译速度的优化【转】
转自:https://blog.csdn.net/QQ1452008/article/details/51851801 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...
- live555学习(一)通读Makefile编译live555
live555学习(一)通读Makefile编译live555 live555 编译live555 学习开源 live555学习(一)通读Makefile编译live555 前言 live555简介 ...
- Gcc And MakeFile Level1
简单介绍gcc And make 的使用 基本编译 gcc a.c b.c -o exeName 分步编译 gcc -c a.c -o a.o gcc a.o b.c -o main.o 使用Make ...
- 手动写Makefile编译Android NDK的so
之所以摒弃NDK,是因为NDK编译出来的so太大,而且导出表总有一些没用的符号.而且手动编译的话,可以得到编译过程中间的.i和.s文件,可以删除一些没用的汇编代码.现在代码列出来:我的NDK C的代码 ...
- CMake 工程调用 Makefile 编译项目
本文主要介绍如何将一个依赖 Makefile 项目(MIDG)移植到 CMake 上. 首先介绍项目文件结构,文件主要由三个目录组成 3rdParty include src 其中,3rdParty ...
- Gcc的Makefile简单使用
Gcc的Makefile简单使用http://blog.chinaunix.net/uid-9330295-id-2425867.html
随机推荐
- Rhel6-cacti+nagios+ganglia(apache)配置文档
(lamp平台) 系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 192.168.122.119 server19.example.com 1 ...
- enmo_day_01
OCP : 三门,sql, 管理一,管理二 VUE 考试中心 OCM : 2天,5年经验 11g grid 12c cloud 个人技术博客 itpub, csdn, 51blog 自己买主机,域名, ...
- C++ 之 const 随笔记
const关键字,相信对C语言有所了解的同学都应该知道他的作用:1.修饰常量,2.修饰指针,3.修饰函数 1.修饰常量 const修饰后的变量被定义为常量 2.修饰指针 当用const修饰指针的时候, ...
- this面试题
// 考题1 /*function Fn() { console.log(this);//window } Fn(); new Fn();//Fn实例 Fn.apply(Fn); //将this指向F ...
- 游戏贴图中常用术语《DC》的理解
什么是DC呢? 在GDI中,DC(Device Context)是一个非常重要的概念. 有的书中,将DC翻译为设备描述表,也有的书中翻译为设备上下文. 但是这些翻译,无法在我们的头脑里有强烈的冲击,无 ...
- Android中SQLite下 Cursor的使用。
引自博客大神一篇文 地址: http://blog.sina.com.cn/s/blog_15e2abdd90102wcdu.html rawQuery()方法用于执行select语句. /* ...
- c语言基础
- H.264简介
H.264/MPEG-4 AVC (H.264) 是1995年自MPEG-2视频压缩标准发布以后最新的, 最有前途的视频压缩标准. H.264是由ITU-U和ISO/IEC联合开发组共同开发的最新国际 ...
- 【LeetCode OJ】Binary Tree Level Order Traversal II
Problem Link: https://oj.leetcode.com/problems/binary-tree-level-order-traversal-ii/ Use BFS from th ...
- 北京网赛I题 hiho1391 (树状数组、区间覆盖最大值问题)
题目链接:http://hihocoder.com/problemset/problem/1391 题意:A国和B国向对方分别投射N枚和M枚导弹(发射时间,飞行时间,伤害值),同时两国各自都有防御系统 ...