GCC - һ�д����↑ʼ

ArticleCategory:

Software Development

AuthorImage:[Here we need a little image from you]

[Lorne Bailey]

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in en Lorne Bailey 

en to zh Zhang Wei 

AboutTheAuthor:[A small biography about the author]

Lorneס��֥�Ӹ磬����һ���������ѯ�ˣ������س��ǰ����ݵ��뵼��Oracle���ݿ⡣ �Դ�ת���������������һֱʹ��*nix������Lorne��ȫ�ܿ��ˡ�DLL�������� �����ڹ����������ѧ˶ʿѧλ��

Abstract:[Here you write a little summary]

Ҫ��������ģ�����Ҫ��C�����л������˽⣬���Ľ��������ʹ��gcc�������� ���ȣ����ǽ�������������з�ʽ��ʹ�ñ���������򵥵�CԴ���롣 Ȼ�����Ǽ�Ҫ����һ�±���������������Щ�������Լ���ο��Ʊ�����̡� ����Ҳ��Ҫ�����˵�������ʹ�÷�����

ArticleIllustration:[One image that will end up at the top of the article]

[Illustration]

ArticleBody:[The main part of the article]

GCC rules

��������ʹ�÷��Դ�����˽�б�����������������������ô֪������������� ��ִ���ļ��м�����ʲô�����ܻ������ֺ��ź�ľ����Ken Thompson��һ������ �ĺڿͣ�����д��һ�����������������������Լ�ʱ������'login'���������º��� �����õ�ľ�����뵽 ���� �Ķ����� ������������������˵��ǣ���������gcc��������� configure; make; make install ʱ�� gcc��Ļ�����˺ܶ෱�صĹ�������β�����gccΪ���ǹ����أ����ǽ���ʼ��дһ��ֽ����Ϸ�� ��������ֻ��Ϊ����ʾ�������Ĺ��ܣ����Ծ����ܵؾ����˴��롣 ���ǽ���ͷ��ʼһ��һ���������Ա����������̣��˽�Ϊ��������ִ���ļ���Ҫ ��Щʲô����ʲô˳���������ǽ�������α���C�����Լ����ʹ�ñ���ѡ�� ��gcc�������ǵ�Ҫ���������裨�Լ����ù��ߣ����£� Ԥ���� (gcc -E)�� ���� (gcc)�� ��� (as)���� ���� (ld)��

��ʼ...

���ȣ�����Ӧ��֪����ε��ñ�������ʵ���ϣ���ܼ򵥡����ǽ����Ǹ������ĵ�һ��C����ʼ�� ����λ��ǰ������ԭ���ң���

#include <stdio.h>

int main()
{ printf("Hello World!\n"); }

������ļ�����Ϊ game.c�� ��������������±�������

gcc game.c
��Ĭ������£�C������������һ����Ϊ a.out �Ŀ�ִ���ļ��� ����Լ�������������������
a.out
Hello World

ÿһ�α������ʱ���µ� a.out ������ԭ���ij������޷�֪�����ĸ� ���򴴽��� a.out�����ǿ���ͨ��ʹ�� -o ����ѡ����� gcc������ѿ�ִ���ļ���ʲô���֡����ǽ������������� game������ ����ʹ���κ����֣���ΪCû��Java�������������ơ�
gcc -o game game.c
game
Hello World

������Ϊֹ��������һ�����õij��򻹲�ú�Զ���������þ�ɥ���������һ������ �Ѿ����벢������һ��������Ϊ���ǽ�һ��һ��Ϊ����������ӹ��ܣ��������DZ��� ��֤�����ܹ����С��ƺ�ÿ���տ�ʼѧ��̵ij���Ա����һ���ӱ�һ��1000�еij��� Ȼ��һ���޸����еĴ���û���ˣ�����˵û���ˣ��������������Ӧ���ȱ�һ������ ���е�С�����޸�����Ȼ���ٴ��������С������������һ���޸ĵĴ������������⣬ ��֪���ղ�������Щ�޸�ʹ�����޷����У������֪��Ӧ�ð�ע���������������� ��ֹ������������֣�����Ϊ���д�Ķ���Ӧ���ܹ���������Ҳ��ͨ�����룬�������� �������С����мǣ��ܹ�ͨ������ij��򲢲���ζ��������ȷ�ġ�

��һ��Ϊ���ǵ���Ϸ��дһ��ͷ�ļ���ͷ�ļ����������ͺͺ����������е���һ���� ����Ա�֤���ݽṹ�����һ���ԣ��Ա�����ÿһ���ֶ�����ͬ���ķ�ʽ����һ�����顣

#ifndef DECK_H
#define DECK_H

#define DECKSIZE 52

typedef struct deck_t
{
  int card[DECKSIZE];
  /* number of cards used */
  int dealt;
}deck_t;

#endif /* DECK_H */

������ļ�����Ϊ deck.h��ֻ�ܱ��� .c �ļ��� �������DZ����޸� game.c����game.c�ĵ�2�У�д�� #include "deck.h"�� �ڵ�5��д�� deck_t deck;��Ϊ�˱�֤����û�и�����������±���һ�Ρ�

gcc -o game game.c

���û�д��󣬾�û�����⡣������벻��ͨ������ô���޸���ֱ����ͨ��Ϊֹ��

Ԥ����

����������ô֪�� deck_t ������ʲô���أ���Ϊ��Ԥ�����ڼ䣬 ��ʵ���ϰ�"deck.h"�ļ����Ƶ���"game.c"�ļ��С�Դ�����е�Ԥ����ָʾ��"#"Ϊǰ׺�� �����ͨ����gcc����� -E ѡ��������Ԥ��������

gcc -E -o game_precompile.txt game.c
wc -l game_precompile.txt
  3199 game_precompile.txt
������3200�е���������д�������� stdio.h �����ļ���������� ��鿴����ļ��Ļ������ǵ�����Ҳ���������㲻�� -o ѡ��ָ�� ����ļ����Ļ����������������̨��Ԥ�������ͨ�����������Ҫ������˴���ܴ�� ����ԡ�
  1. ��"include"���ļ�������Ҫ�����Դ�ļ��С�
  2. ��ʵ��ֵ���"define"���ı���
  3. �ڵ��ú�ĵط����к��滻��
���ʹ���ܹ�������Դ�ļ���ʹ�÷��ų���������DECKSIZE��ʾһ�����е�ֽ���������� �����ų�������һ���ط�����ģ��������ֵ�����˱仯������ʹ�÷��ų����ĵط� �����Զ����¡���ʵ���У��㼸������Ҫ����ʹ�� -E ѡ��������� ��������͸���������

����

��Ϊһ���м䲽�裬gcc����Ĵ��뷭��ɻ�����ԡ���һ��Ҫ��������������ͨ������ ��Ĵ��������㾿����Ҫ��ʲô������㷸���﷨�������ͻ�����㣬���������ʧ���ˡ� ������ʱ�����һ�����Ϊ�������̡����ǣ�ʵ���ϻ������๤��Ҫgccȥ���ء�

���

as �ѻ�����Դ���ת��ΪĿ����롣��ʵ��Ŀ����벢������CPU�����У� ����������Ѿ��ܽ��ˡ�������ѡ�� -c �� .c �ļ�ת��Ϊ�� .o Ϊ��չ�� ��Ŀ���ļ��� �����������

gcc -c game.c
���Ǿ��Զ�������һ����Ϊgame.o���ļ�����������������һ����Ҫ�����⡣���ǿ����� ����һ�� .c �ļ�����һ��Ŀ���ļ������������������������ģ������Ӳ��������ǿ��� ����ЩĿ���ļ���ϳɿ�ִ���ļ��������Ǽ����������ǵ����ӡ���Ϊ�������ڱ�дһ�� ֽ����Ϸ�������Ѿ���һ���ƶ���Ϊ deck_t�����ǽ���дһ��ϴ�ƺ����� �����������һ��ָ��deck���͵�ָ�룬����һ���������װ��deck���͡���ʹ��'drawn' ������ټ�¼��Щ���Ѿ��ù��ˡ��������DECKSIZE��Ԫ�ص�������Է�ֹ�����ظ�ʹ�� һ���ơ�

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "deck.h"

static time_t seed = 0; 

void shuffle(deck_t *pdeck)
{ 
  /* Keeps track of what numbers have been used */
  int drawn[DECKSIZE] = {0}; 
  int i;           

  /* One time initialization of rand */
  if(0 == seed) 
  {
    seed = time(NULL);  
    srand(seed);
  }
  for(i = 0; i < DECKSIZE; i++)
  {
    int value = -1;
    do
    {
      value = rand() % DECKSIZE;
    }
    while(drawn[value] != 0); 

    /* mark value as used */ 
    drawn[value] = 1; 

    /* debug statement */
    printf("%i\n", value); 
    pdeck->card[i] = value;
  }
  pdeck->dealt = 0;
  return;
}

������ļ�����Ϊ shuffle.c����������������м�����һ��������䣬 �Ա�����ʱ����������������ƺš��Ⲣû��Ϊ���ǵij������ӹ��ܣ��������ڵ��� �ؼ�ʱ�̣����ǿ�������������ʲô����Ϊ���ǵ���Ϸ���ڳ����׶Σ�����û�б�� �취ȷ�����ǵĺ����Ƿ�ʵ��������Ҫ��Ĺ��ܡ�ʹ������printf��䣬���Ǿ���׼ȷ ��֪�����ھ���������ʲô���Ա��ڿ�ʼ��һ�׶�֮ǰ����֪�����Ѿ�ϴ���ˡ������� �����Ĺ����е�����֮�����ǿ��԰���һ�����Ӵ�����ɾ�������ֵ��Գ���ļ��� �������ֲܴڣ�����ʹ�����ٵ��������˵��������Ժ������ٽ��ܸ����ӵĵ�������

��ע���������⡣
  1. �����ô�ַ��ʽ���ݲ���������Դ�'&'��ȡ��ַ������������������ѱ����Ļ�����ַ ���ݸ��˺�������˺����Լ����ܸı������ֵ��Ҳ����ʹ��ȫ�ֱ�����д���򣬵���Ӧ�� ������ʹ��ȫ�ֱ�����ָ����C��һ����Ҫ��ɲ��֣���Ӧ�ó�ֵ���������
  2. ������һ���µ� .c �ļ���ʹ�ú������á�����ϵͳ����Ѱ����Ϊ'main'�ĺ��������� ���↑ʼִ�С� shuffle.c ��û��'main'��������˲��ܱ���Ϊ�����Ŀ�ִ���ļ��� ���DZ����������һ������'main'����������'shuffle'�ij������������

��������

gcc -c shuffle.c
��ȷ����������һ����Ϊ shuffle.o �����ļ����༭game.c�ļ����ڵ�7�У��� deck_t���͵ı��� deck ����֮�󣬼���������һ�У�
shuffle(&deck);
���ڣ�������ǻ�����ǰһ��������ִ���ļ������Ǿͻ�õ�һ������
gcc -o game game.c

/tmp/ccmiHnJX.o: In function `main':
/tmp/ccmiHnJX.o(.text+0xf): undefined reference to `shuffle'
collect2: ld returned 1 exit status
����ɹ��ˣ���Ϊ���ǵ��﷨����ȷ�ġ��������Ӳ���ȴʧ���ˣ���Ϊ ����û�и��߱�����'shuffle'��������� ��ô������ʲô�����ӣ������������߱�����������Ѱ����������أ�

����

������ld��ʹ��������������ǰ���� as ������Ŀ���ļ�������ת��Ϊ��ִ���ļ�

gcc -o game game.o shuffle.o
�⽫������Ŀ���ļ����������������ִ���ļ� game��

��������shuffle.oĿ���ļ����ҵ� shuffle ��������������������ִ���ļ��� Ŀ���ļ��������ô����ڣ�����������ٴ�ʹ���Ǹ�������������Ҫ���ľ��ǰ���"deck.h" �ļ����� shuffle.o Ŀ���ļ����ӵ��µĿ�ִ���ļ��С�

�������Ĵ��������Ǿ��������ġ���Ȼ���Dz�û�б�дǰ����Ϊ���������õ� printf ������������ȴ�ܴ������� #include <stdlib.h> ���������ļ��� �ҵ��������������Ѵ洢��C�⣨/lib/libc.so.6���е�Ŀ��������ӽ����� ���ַ�ʽʹ���ǿ���ʹ��������ȷ�����������˵ĺ�����ֻ����������Ҫ��������⡣ �����Ϊʲôͷ�ļ���һ��ֻ�������ݺͺ�����������û�к����塣һ�㣬�����Ϊ ����������Ŀ���ļ������⣬�Ա����ӽ���ִ���ļ������ǵĴ�����ܲ������⣬��Ϊ ��ͷ�ļ�������û�з����κκ���������Ϊ��ȷ��һ��˳�������ǻ�����ʲô�أ�

����������Ҫѡ��

-Wall ѡ����Դ��������͵��﷨���棬�Ա��������ȷ����������ȷ�ģ� ���Ҿ�����ʵ�ֿ���ֲ�ԡ�������ʹ�����ѡ��������ǵĴ���ʱ�����ǽ������������棺

game.c:9: warning: implicit declaration of function `shuffle'
��������֪������һЩ����Ҫ����������Ҫ��ͷ�ļ��м���һ�д��룬�Ա���߱������й� shuffle ������һ�У�������������Ҫ�ļ�顣����������һ�ֽƱ磬�������� ���԰Ѻ����Ķ�����ʵ�ַ��뿪����ʹ���������κεط�ʹ�����ǵĺ�����ֻҪ�����µ�ͷ�ļ� ���������ӵ����ǵ�Ŀ���ļ��оͿ����ˡ��������ǾͰ���һ�м���deck.h�С�
void shuffle(deck_t *pdeck);
��Ϳ��������Ǹ�������Ϣ�ˡ�

��һ�����ñ�����ѡ�����Ż�ѡ�� -O# (�� -O2)�� ���Ǹ��߱���������Ҫʲô������Ż�������������һ���׼��ɿ���ʹ��Ĵ������еø���һ�㡣 ��������������С���������ע�ⲻ����𣬵����ڴ��ͳ�����˵�������Դ������������ٶȡ� ��ᾭ����������������Ӧ��֪��������˼��

����

���Ƕ�֪��������ͨ���˱��벢����ζ���������ǵ�Ҫ�����ˡ������ʹ�������������֤ �Ƿ����еĺ��붼��ʹ����

game | sort - n | less
���Ҽ����û����©��������������Ǹ���ô�죿������β�������ײ���Ҵ����أ�

�����ʹ�õ����������Ĵ��롣��������а涼�ṩ�����ĵ�������gdb�������Щ�ڶ��������ѡ�� ����е������ʴӣ���ô�����ʹ��KDE�ṩ��һ���ܺõ�ǰ�˹��� KDbg�� ����һЩ������ǰ�˹��ߣ����Ƕ������ơ�Ҫ��ʼ���ԣ������ѡ�� File->Executable Ȼ���ҵ���� game ���� ���㰴��F5����ѡ�� Execution->�Ӳ˵�����ʱ�����������һ�������п�������� ��ô���£����Ǹ�����������ʲôҲ����������Ҫ���ģ�KDbgû�г����⡣������������ �ڿ�ִ���ļ���û�м����κε�����Ϣ������KDbg���ܸ��������ڲ�������ʲô��������ѡ�� -g ���԰ѱ�Ҫ�ĵ�����Ϣ����Ŀ���ļ�������������ѡ�����Ŀ���ļ� ����չ��Ϊ.o�������������г��ˣ�
gcc -g -c shuffle.c game.c
gcc -g -o game game.o shuffle.o
��Ͱѹ��ӷ����˿�ִ���ļ���ʹgdb��KDbg��ָ�����������������һ�ֺ���Ҫ�ļ������� ֵ���㻨ʱ��ѧϰ���ʹ�á���������������Ա�ķ�����������Դ���������á��ϵ㡱����������� ���Ҽ��������� shuffle ���������д��룬�������öϵ㡣��һ�б��ϻ����һ�� ��ɫ��СԲȦ�����ڵ��㰴��F5��ʱ������ͻ�����һ��ִֹͣ�С���F8��������shuffle������ �ǣ��������ڿ��Կ��� shuffle.c �еĴ����ˣ����ǿ��Կ��Ƴ���һ��һ����ִ�У� ����������������ʲô�¡������ѹ����ͣ�ھֲ������ϣ��㽫�ܿ������������ݡ� ̫���ˡ�������� printf ���ö��ˣ��Dz��ǣ�

��

���Ĵ�������˱���͵���C����ķ��������������˱������߹��IJ��裬�Լ�Ϊ���� ����������Щ����Ӧ�ø�gcc������Щѡ����Ǽ������й����ӹ�������������⣬ �������˵������������˽��������µĹ�������Ҫ��������Ŭ��������ϣ������ ��������ȷ���𲽡�������� gcc�� as �� ld�� man �� info page�� �ҵ��������Ϣ��

�Լ���д�����������ѧ������Ķ�������Ϊ��ϰ������Ա��ĵ�ֽ����ϷΪ��������д һ��21����Ϸ����ʱ�����ѧѧ���ʹ�õ�������ʹ��GUI��KDbg��ʼ���Ը�����һЩ�� �����ÿ��ֻ����һ��㹦�ܣ���ô�ܿ������ɡ��мǣ�һ��Ҫ���ֳ���һֱ�����У�

Ҫ���дһ����������Ϸ������Ҫ������Щ���ݣ�

վ������