Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1048662
  • 博文数量: 297
  • 博客积分: 11721
  • 博客等级: 上将
  • 技术积分: 3431
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-25 10:21
文章分类

全部博文(297)

文章存档

2016年(9)

2011年(71)

2010年(137)

2009年(80)

分类: C/C++

2009-11-30 17:04:34

GCC的-g选项应该在编译阶段起作用
 
编译过程:

源代码.c -->预处理(把头文件.h纳入,预处理之后生成的是.i文件) -->编译(检查正确后生成.s汇编代码文件) -->汇编处理(将编译阶段生成的.s文件转换成目标文件.o) -->链接(生成可执行文件)

那么-g选项具体加在那个过程呢?实际上,-g选项应该在编译阶段加入,在生成的汇编代码文件中就有了调试信息,否则就会出现start.S找不到的情况了。所以,Makefile文件如下:

CC = gcc

OBJS = main.o getline.o copy.o

zifu: $(OBJS)

        $(CC) $^ -o $@

main.o:main.c gc.h

        $(CC) -g -c $<

getline.o:getline.c

        $(CC) -g -c $<

copy.o:copy.c

        $(CC) -g -c $<

.PHONY:clean

clean:

        rm -f $(OBJS) zifu 

----------------------------------------

附:实例源代码

[armlinux@lqm example3]$ tree
.
|-- Makefile
|-- copy.c
|-- gc.h
|-- getline.c
`-- main.c

0 directories, 5 files
 

 

/*
 *copy.c
 *copy 'from' into 'to';assume to is big enough
 */

void copy(char to[],char from[])
{
        int i;

        i = 0;
        while ((to[i] = from[i]) != '\0')
                ++i;
}
 

 

/*
 *getline.c
 *read a line into s,return length
 */

#include

int getline(char s[],int lim)
{
        int c,i;

        for (i = 0 ; i < lim-1 && (c = getchar()) != EOF && c != '\n' ; ++i)
                s[i] = c;
        if (c == '\n') {
                s[i] = c;
                ++i;
        }
        s[i]='\0';
        return i;
}
 

 

/*
 *main.c
 */

#include
#include "gc.h"

#define MAXLINE 1000

int main()
{
    int len;
    char line[MAXLINE];
    char longest[MAXLINE];

    while((len=getline(line,MAXLINE))>0)
    {
        copy(longest,line);
        printf("%s",longest);
    }
    return 0;
}

/*

 *gc.h

 */

int getline(char [],int);
void copy(char [],char []);
 

这个project很短小,但是也说明了如何建立多个源文件的project。其中,公用的宏定义、自定义的函数声明、自定义的结构体变量都放在自定义头文件里。事先要规划好程序结构!

另如果要加入线程库等,只需在链接时加入,以下是一个带线程库的makefile实例:

CC = gcc

OBJS = main.o pthread_pool.o signal_sync.o

main: $(OBJS)
    $(CC) $^ -lpthread -o $@

main.o:main.c
    $(CC) -g -c $<

pthread_pool.o:pthread_pool.c
    $(CC) -g -c $<

signal_sync.o:signal_sync.c
    $(CC) -g -c $<

.PHONY:clean

clean:

    rm -f $(OBJS) main
阅读(987) | 评论(0) | 转发(0) |
0

上一篇:gdb调试的一个例子

下一篇:cron与deamon

给主人留下些什么吧!~~