original in en Lorne Bailey
en to zh Zhang Wei
Lorneס��֥�Ӹ磬����һ���������ѯ�ˣ������س��ǰ����ݵ��뵼��Oracle���ݿ⡣ �Դ�ת���������������һֱʹ��*nix������Lorne��ȫ�ܿ��ˡ�DLL�������� �����ڹ����������ѧ˶ʿѧλ��
��������ʹ�÷��Դ�����˽�б�����������������������ô֪�������������
��ִ���ļ��м�����ʲô�����ܻ������ֺ��ź�ľ����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
ѡ��ָ��
����ļ����Ļ����������������̨��Ԥ�������ͨ�����������Ҫ������˴���ܴ��
����ԡ�
-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��䣬���Ǿ���ȷ
��֪�����ھ���������ʲô���Ա��ڿ�ʼ��һ��֮ǰ����֪�����Ѿ�ϴ���ˡ�������
�����Ĺ����е�����֮�����ǿ�����һ�����Ӵ�����ɾ�������ֵ��Գ���ļ���
�������ֲܴڣ�����ʹ�����ٵ��������˵��������Ժ������ٽ��ܸ����ӵĵ�������
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��ʼ���Ը�����һЩ�� �����ÿ��ֻ����һ��㹦�ܣ���ô�ܿ������ɡ��мǣ�һ��Ҫ���ֳ���һֱ�����У�
Ҫ���дһ����������Ϸ������Ҫ������Щ���ݣ�