//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写法的更多相关文章

  1. 使用gcc编译gdb调试

    gcc 在linux系统中,默认是没有安装gcc编译器的,可以通过命令 rpm -q | grep gcc 来查看.安装命令为: yum -y install gcc 安装后,编写一个.c结尾的文件. ...

  2. GCC、GDB、Makefile

    1.GCC程序编译 Linux系统下的gcc(GNUCCompiler)是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作之一.gcc可以在多种硬体平台上编译出可执行程序,其执行效率与一 ...

  3. linux下gcc编译的参数详细说明

    参考网址:1 http://hi.baidu.com/zengzhaonong/item/f1f9383565fa5c302e0f8125 gcc使用方法 汇总 2 http://s99f.blog. ...

  4. gdb调试高级用法

    Linux下进程崩溃时定位源代码位置 如何在调试内核时,同时可以调试应用程序的做法: (cskygdb) c Continuing. ^C Program received signal SIGINT ...

  5. GCC编译UDF和gdb调试UDF

    Fluent版本:19.0 前面我们介绍过使用VS来编译和调试UDF,其实我们也可以用GCC来编译UDF.gdb调试UDF.本次介绍的方法更具有通用性,也适用于Linux下Fluent的UDF编译和调 ...

  6. Linux——【转】gcc编译与gdb调试简要步骤

    原文:gcc编译与gdb调试简要步骤 一.Linux程序gcc编译步骤: Gcc编译过程主要的4个阶段: l 预处理阶段,完成宏定义和include文件展开等工作:(.i) l 根据编译参数进行不同程 ...

  7. gcc编译与gdb调试简要步骤

    http://blog.chinaunix.net/uid-24103300-id-108248.html 一.Linux程序gcc编译步骤: Gcc编译过程主要的4个阶段: l 预处理阶段,完成宏定 ...

  8. linux下gcc编译多个源文件、gdb的使用方法

    一. gcc常用编译命令选项 假设源程序文件名为test.c. 1. 无选项编译链接 用法:#gcc test.c 作用:将test.c预处理.汇编.编译并链接形成可执行文件.这里未指定输出文件,默认 ...

  9. 转 C编译: 使用gdb调试

    C编译: 使用gdb调试   作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! gdb是the GNU Debugger的简称.它是 ...

随机推荐

  1. 在网页标题栏上和收藏夹显示网站logo

    第一步,准备一个图标制作软件. 首先您必须了解所谓的图标(Icon)是一种特殊的图形文件格式,它是以.ico 作为扩展名.普通的图像设计软件无法使用这种格式,所以您需要到下载一个ico图标工具,本站常 ...

  2. CERT_KEY_CONTEXT_PROP_ID,CERT_KEY_PROV_INFO_PROP_ID,CERT_KEY_PROV_HANDLE_PROP_ID和CERT_KEY_SPEC_PROP_ID

    上面四个属性是CertSetCertificateContextProperty或CertGetCertificateContextProperty可以为证书上下文设置的几个属性,下面对它们的关联简单 ...

  3. 【jmeter】ANT批量执行Jmeter脚本

    一.环境准备: 1.Jdk1.6或以上:命令行输入:java -version,出现如下提示说明安装成功 2.ANT下载:http://ant.apache.org/bindownload.cgi 命 ...

  4. 连接数据库的URL等于多少?

    JDBC编程步骤如下: 1.加载驱动 Class.forname(driverClass); 比如:加载MySQL的驱动 Class.forname("com.mysql.jdbc.Driv ...

  5. 从官方下载 Bootstrap 版本 并写 第一个页面

    从官方下载  Bootstrap 版本 页面内容参考自 http://www.cnblogs.com/sanjuantianshu/p/3935120.html bootstrap-3.2.0.zip ...

  6. mvc 权限管理 demo

    http://blog.csdn.net/zht666/article/details/8529646 new http://www.cnblogs.com/fengxing/archive/2012 ...

  7. [Serializable]的应用--注册码的生成,加密和验证

    1.首先定义注册类RegisterEntity [Serializable] public class RegisterEntity { public string RegisterKey; publ ...

  8. Hbase伪分布式

    其实我就是要让数据存储在hdfs上而已........ 多配置点东西就好了,在hbase-site.xml中加入: <configuration> <property> < ...

  9. 使用thinkphp连接sqlserver数据库时提示“系统不支持:sqlsrv”

    习惯了使用php跟mysql组合,现在接到项目需要调用客户线下的系统软件的数据,具了解,这个软件的数据库是用sqlserver数据库也就是常说的mssql数据库了. 那么我现在需要用PHP连接sqls ...

  10. phpStudy Linux安装集成环境 (CentOS--7)

    phpStudy for Linux (lnmp+lamp一键安装包) phpStudy for Linux 支持Apache/Nginx/Tengine/Lighttpd, 支持php5.2/5.3 ...