gcc编译, gdb调试, makefile写法
//test.c:
#include <stdio.h>
int main(void)
{
printf("hello world!");
return 0;
}
======================================
一、
1. 编译过程:预处理(processing)-》编译(compilation)-》汇编(assembly)->Linking
2. 预处理:
gcc -E test.c -o test.i / gcc -E test.c
预处理的结果就是将stdio.h文件中的内容插入到test.c中
3.编译为汇编代码:
gcc -S test.i -o test.s
-S选项表示生成汇编代码, -o表示输出汇编代码文件。
4. 汇编:
gcc -C test.s -o test.o
汇编器将汇编代码编译成目标文件
5. 链接:
gcc test.o -o test
二、
1.对多个文件进行编译:
gcc test1.c test2.c -o test
2.检错
gcc -pedantic illcode.c -o illcode
-pedantic 帮助程序员发现不符合ansi/iso标准代码。
-Wall 使gcc产生尽可能多的警告信号
-Werror会在警告的地方停止编译,迫使程序员对自己代码进行修改
三、库文件的链接:
函数库是由一些头文件(.h)和库文件(.so, .lib, .dll)的集合。 LINUX默认将头文件放在/usr/include/, 库文件放在/usr/lib/; 如果我们要用的库不在这些目录下,所以在gcc编译的时候必须用自己的办法来查找所需要的头文件和库文件。
例: test.c链接mysql,我们要下载mysql的库——MySQL Connectors, 下下来以后由个include的文件夹, 里面包含头文件, 还有一个lib的文件夹,里面包含二进制so文件libmysqlclient.so,其中include的路径是/usr/dev/mysql/include, lib的文件夹是/usr/dev/mysql/lib
1. 编译成目标文件:
gcc -c -I /usr/dev/mysql/include test.c -o test.o
2. 链接:最后我们把所有的目标文件链接成可执行文件。
gcc -L /usr/dev/mysql/lib -lmysqlclient test.o -o test
linux下动态链接库用so结尾,静态链接库由a结尾。
3.强制链接时使用静态链接库:
加-static
gcc -L /usr/dev/mysql/lib -static -lmysqlclient test.o -o test
静态库搜索顺序
(1). ld 会去找gcc命令中参数-L
(2)再找gcc环境变量library_PATH
(3)再找内定目录/lib, /usr/lib, /usr/local/lib
动态链接搜索顺序:
(1)编译目标代码时候指定的搜索路径
(2)环境变量LD_LIBRARY_PATH
(3)配置文件/etc/ld.so.con
(4)/lib, /usr/lib
GDB调试:
1. gcc -g main.c -o main
在用gcc时候,加上-g表示在生成的目标文件中加入源代码信息以便调试
2. l, list 从第一行开始列出源代码
3. start, 开始执行程序,第一行break
4. n, next下一行
5. s, step进入函数
6. bt, backtrace查看函数栈
7. i locals, 用info命令查看局部变量
8. f 1, 到栈帧1
9. p sum, print出sum的值
10. finish, 运行到返回点——如果是从s进来的函数
11. set var sum=0, 调试过程中给变量sum赋值
12. p result[2]=33, 用p赋值
13. display sum, 每次程序停止的时候显示sum的值
14. b, break当前的循环
15. b 9, 在第9行设置断点
16. c, 连续运行continue
17. i breakpoints, 查看所有断点
18. delete breakpoint 2, 删除断点2
19. disable breakpoint 2 , 禁用断点2
20. enable breakpoint 2 , 启用
21. break 9 if sum!=0 , 当满足条件时候断点激活
22. r , 从头开始执行run
Makefile基础:
1. Makefile 是由一组rule组成, 每条rule信息如下:
target ...: prerequistites ...
<tab>command1
<tab>command2
例:
main: main.o stack.o maze.o
gcc main.o stack.o maze.o -o main
只要有一个prerequisities更新了,目标也会被更新,就是执行command
2. clean规则
用于清除编译产生的二进制文件,保留源文件:
clean:
@echo "cleaning project"
-rm main *.o
@echo "clean completed"
如果命令前加@则不显示命令本身,只显示结果。 如果加-表示即使命令出错也不会停止。 通常rm或者mkdir前面要加-,因为可能没有这个文件,或者已经有了这个文件。
如果存在有文件名字就叫做clean,则会出错,那么就要添加一行,将clean关键字申明成伪目标
.PHONY:clean
3. 4个规则关键字:
install:将可执行文件、配置文件、docs分别拷贝到不同安装目录
all:执行主要编译工作,通常用作缺省目标
clean:删除编译生成的二进制文件
distclean:不仅删除二进制文件,还删除其他的,只留下源文件。
4. 隐含规则和模式规则:
其中有一条
%.o: %.c
$(compile.c) $(output_option) $<
$@为规则中的target, $<为规则中的第一个条件,上面那句相当于 cc -c $@ $<
进而相当于所有符合这样的依赖关系:
main.o:main.h statk.h maze.h
可以隐含
main.o: main.c
cc -c o main.o main.c
5. 变量:
main.o: main.c
$(CC) $(CFLAGS) $(CPPFLAGS) -c $<
CC = gcc
CFLAGS = -o -g
CPPFLAGS = -Iinclude
:=, 立即赋值
?=, 如果没有赋过值才进行赋值
+=, 追加赋值
$^, 表示将所有条件组成的列表
$?, 表示所有比目标新的条件组成的列表
6. 自动处理依赖关系:
例:
all: main
main: main.o stack.o maze.o
gcc $^ -o $@
clean:
-rm main *.o
.PHONY: clean
sources = main.c stack.c maze.c
include $(souces: .c = .d)
%.d: %.c
set -e; rm -f $@;\
$(CC) -MM $(CPPFLAGS) $< > $@.$$$$;\ # $$$$相当于两个$ , 表示进程
....略...
gcc编译, gdb调试, makefile写法的更多相关文章
- 使用gcc编译gdb调试
gcc 在linux系统中,默认是没有安装gcc编译器的,可以通过命令 rpm -q | grep gcc 来查看.安装命令为: yum -y install gcc 安装后,编写一个.c结尾的文件. ...
- GCC、GDB、Makefile
1.GCC程序编译 Linux系统下的gcc(GNUCCompiler)是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作之一.gcc可以在多种硬体平台上编译出可执行程序,其执行效率与一 ...
- linux下gcc编译的参数详细说明
参考网址:1 http://hi.baidu.com/zengzhaonong/item/f1f9383565fa5c302e0f8125 gcc使用方法 汇总 2 http://s99f.blog. ...
- gdb调试高级用法
Linux下进程崩溃时定位源代码位置 如何在调试内核时,同时可以调试应用程序的做法: (cskygdb) c Continuing. ^C Program received signal SIGINT ...
- GCC编译UDF和gdb调试UDF
Fluent版本:19.0 前面我们介绍过使用VS来编译和调试UDF,其实我们也可以用GCC来编译UDF.gdb调试UDF.本次介绍的方法更具有通用性,也适用于Linux下Fluent的UDF编译和调 ...
- Linux——【转】gcc编译与gdb调试简要步骤
原文:gcc编译与gdb调试简要步骤 一.Linux程序gcc编译步骤: Gcc编译过程主要的4个阶段: l 预处理阶段,完成宏定义和include文件展开等工作:(.i) l 根据编译参数进行不同程 ...
- gcc编译与gdb调试简要步骤
http://blog.chinaunix.net/uid-24103300-id-108248.html 一.Linux程序gcc编译步骤: Gcc编译过程主要的4个阶段: l 预处理阶段,完成宏定 ...
- linux下gcc编译多个源文件、gdb的使用方法
一. gcc常用编译命令选项 假设源程序文件名为test.c. 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理.汇编.编译并链接形成可执行文件.这里未指定输出文件,默认 ...
- 转 C编译: 使用gdb调试
C编译: 使用gdb调试 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! gdb是the GNU Debugger的简称.它是 ...
随机推荐
- 设计师必看的10个HTML5动画工具
如果你想用令人难以置信的动画创建引人注目的网站的话,那么这里为设计师精心挑选了一些必备的HTML5动画工具.HTML5是设计师用来打造时尚网站的最流行的编程语言之一.在过去三年内,这种编程语言的使用人 ...
- js为DIV动态设置id属性
<script> var objs=document.getElementById("iproduct").getElementsByTagName("div ...
- 剑指offer系列37----数据流中的中位数
[题目]如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值, * 那么中位数就是所有数值排序之后位于中间的数值. package com.exe8.offer; import java.uti ...
- LitDB文章
阅读目录 1.LiteDB初步介绍 2.LiteDB使用基本案例 3.LiteDB的技术细节 4.资源其他 今天给大家介绍一个不错的小巧轻量级的NoSQL文件数据库LiteDB.本博客在2013年也介 ...
- [Freescale]E9学习笔记-LTIB总结
转自:http://blog.csdn.net/wl_haanel/article/details/6231353 写在前面 符号'##'后面语句均为注释 需要做的操作 ...
- Screen-后台运行
文章转自:http://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html 本来想搜集资料写一个的,结果发现该博主已经总结的很好,条理清晰. ...
- 【Linux】系统之vmstat&iostat
Linux系统出现了性能问题,一般我们可以通过top.iostat.free.vmstat等命令来查看初步定位问题. iostat常见用法: $iostat -d -k 1 10 #查看TPS和吞吐量 ...
- Cygwin之SSH服务安装过程问题
1.折磨了最长时间的一个问题 $ ssh localhostssh: connect to host localhost port 22: Connection refused 各种google,百度 ...
- 黄聪:在WordPress后台文章编辑器的上方或下方添加提示内容
WordPress 3.5 新增了一对非常有用的挂钩,可以快速在WordPress后台文章编辑器的上方或下方添加提示内容,下面是一个简单的例子,直接将代码添加到主题的 functions.php 文件 ...
- (WPF) MVVM: ComboBox Binding, XML 序列化
基本思路还是在View的Xmal里面绑定ViewModel的属性,虽然在View的后台代码中也可以实现binding,但是还是在Xmal里面相对的代码量要少一些. 此例子要实现的效果就是将一个List ...