[LinuxFocus-icon]
��ҳ  |  վ����ͼ  |  ����  |  ����

���� | �����ڿ� | ���� | ����LF
This document is available in: English  Castellano  ChineseGB  Deutsch  Francais  Italiano  Portugues  Russian  Turkce  Arabic  

[Lorne Bailey]
by Lorne Bailey
<sherm_pbody(at)yahoo.com>

��������:

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


Ŀ¼:

 

GCC - һ�д����↑ʼ

[Illustration]

ժҪ:

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

 

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��ʼ���Ը�����һЩ�� ������ÿ��ֻ����һ���㹦�ܣ���ô�ܿ��������ɡ��мǣ�һ��Ҫ���ֳ���һֱ�����У�

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

 

վ������

 

����ƪ���·�������

ÿƪ���¶��и��Եķ���ҳ�档������ҳ����������ύ���ۣ�Ҳ���Բ鿴�������ߵ����ۣ�
 ����ҳ�� 

��ҳ��LinuxFocus�༭��ά��
© Lorne Bailey, FDL
LinuxFocus.org

����������LinuxFocus������������������
������Ϣ:
en --> -- : Lorne Bailey <sherm_pbody(at)yahoo.com>
en --> zh: Zhang Wei <Dr_ZhangWei(at)hotmail.com>

2002-03-13, generated by lfparser version 2.27