gcc学習ノート(一)-Cプログラムのコンパイルとコンパイル過程
一.Cプログラムコンパイルプロセス
コンパイルプロセスの概要:C言語のソースファイルを実行可能ファイルにコンパイルするには4つのステップが必要で、前処理(Preprocessing)拡張マクロ、コンパイル(compilation)はアセンブリ言語を得て、アセンブリ(assembly)はマシンコードを得て、接続(linking)は実行可能ファイルを得る;
--各ステップのコンパイルの詳細を表示します:「-E」は前処理に対応し、「-S」はコンパイルに対応し、「-c」はアセンブリに対応し、「-O」は接続に対応します.
--各ステップに対応するツール:プリプロセッサ(CPP-The C Preprogressor)、コンパイラ(cc 1)、アセンブリ(as)、コネクタ(ld);
--全体的なコンパイルの詳細を表示する:「-v」パラメータを使用して、全体的なコンパイルの詳細を表示します.
1.前処理
前処理コマンド:ソースプログラムで「#」で始まるコマンドは、「#include」、「#define」、「ifndef」などの前処理コマンドです.
前処理プロセス:前処理はincludeのファイルをソースファイルに挿入し、defineマクロ定義を展開し、条件に基づいてコードをコンパイルする.
次のソースプログラムをコンパイルします.
前処理結果:前処理ソースプログラムで生成された結果は「.i」接尾辞のファイルに格納され、デフォルトでは「.i」接尾辞ファイルはディスクに書き込まれず、「-save-temps」パラメータを加えると、すべての中間ファイルがディスクに保存されます.
--以下の例を分析する:gcc-save-temps mainを用いる.cコマンドはソースプログラムをコンパイルして、すべての中間ファイルは保留して、main.iは前処理結果、main.sはコンパイル結果、main.oはアセンブリ結果であり、a.outは接続生成の実行可能ファイルである.
前処理の詳細を表示する:gcc-E mianを使用する.cコマンドは、コンパイルの詳細を出力し、千行以上印刷します.ここには部分だけが貼られています.
マクロ定義はgccコマンドラインで行う:gcc-DNEM=5 mainを用いる.cコマンドは、プログラムでNUMマクロ定義を使用できます.「-DRAM」は、プログラムで「#define NUM 5」を定義することに相当します.
-- main.c内容:
コンパイルプロセス:
2.コンパイル
コンパイルプロセス:コンパイラはコンパイル段階で順次文法分析、文法分析、コード最適化、記憶分配、コード生成の5つのステップを実行する.
--マルチスキャンスキーム:コンパイラはコードをスキャンするたびに1つの作業しか完了しません.例えば、1回目のスキャンは文法分析のみを行い、2回目のスキャンは文法分析を行い、スキャンは上記の5つのステップを複数回完了します.
中間のアセンブリ中間ファイルを生成する:gcc-S mainを使用する.c上のmainをコンパイルする.cソースプログラム、mianを得ることができます.sアセンブリ言語ファイル、これは生成された中間アセンブリプログラムである.
--コンパイルプロセスと結果:
3.アセンブリ
アセンブリプロセス:アセンブリはアセンブリ言語コードをマシンコード、すなわち「.o」接尾辞のオブジェクトファイルに翻訳し、アセンブリasを使用して実現する.
中間ファイルの取得:「-c」オプションは、アセンブリ中の「.o」接尾辞の中間ファイルを保持し、gcc-c mainを使用することができる.cコマンド、mainを取得できます.oオブジェクトファイル;
4.接続
リンクプロシージャ:ldコネクタを使用して、アセンブリ中に生成された「.o」オブジェクトファイルを他のオブジェクトファイルとライブラリファイルに接続し、実行可能なバイナリファイルを生成します.
接続例:gcc mainを使用する.oアセンブリプロセスで生成するオブジェクトファイルmain.o、実行可能ファイルa.outを生成する.
二.Cプログラムのコンパイル
1.単一Cプログラムのコンパイル
C言語プログラム例:簡単なHello World;
単純コンパイル:使用シヨウ
gcc main.cコマンド、a.out実行可能ファイルが生成され、./a.outはコンパイルされたCプログラムを実行することができる.
出力ファイルコンパイルの指定:a.outを出力ファイルとして使用したくない場合は、-oパラメータを使用して出力ファイルを指定し、そのファイルが存在する場合は上書きします.
--コマンド:gcc main.c -o main;
警告オプションを表示します:-Wallオプション、コンパイル時に警告情報を端末に出力することができます;
--出力警告情報のコンパイル:gcc-Wall main.c;
人為的な製造警告:printf出力時に、intデータのプレースホルダとして%sを使用します.
コンパイルの実行:
gcc -Wall main.c,コンパイル時に警告を出したが,コンパイルは通過したが,実行時にエラーが発生した.
2.複数のファイルのコンパイル
3つのファイルからなるプログラム:kill.h, kill.c, main.c,main.cはメイン関数のエントリでkillを呼び出す.c定義の方法;
-- kill.h内容:killメソッドを宣言し、このヘッダファイルを参照するとkillメソッドを使用できます.
kill.c内容:主にkillを実現する.hで宣言されたkillメソッド;
mian.c内容:kill.hライブラリ;
ヘッダファイルライブラリ記号の違い:#include"kill.h"#include ;
--#include"kill.h":まず現在のディレクトリでkillを検索します.hヘッダファイル、システムにおいて当該ヘッダファイルを検索する;
-- #include:システムライブラリに直接ヘッダファイルを探して、現在のディレクトリを検索しません.
ファイルのコンパイル:gcc-Wall mainを使用します.c kill.c-o killはコンパイルを行う.
3.独立してファイルをコンパイルする
開発ニーズ:1つのプロジェクトが比較的大きい場合、プロジェクト全体のコンパイル時間は長くなり、1つの関数を変更するとプロジェクト全体を再コンパイルする必要があり、時間を浪費します.
--ソリューション:プログラムは複数のソースファイルに格納され、各ソースファイルは個別にコンパイルされます.
複数のソースファイルを個別にコンパイルするには、まずオブジェクトファイルを生成し、次にオブジェクトファイルリンクを実行可能ファイルを生成します.
--コンパイル対象ファイル:ソースプログラムを実行不可能なファイルにコンパイルし、生成する.o接尾辞のオブジェクトファイル;
--リンクプログラム:gccには、すべてのオブジェクトファイルをリンクし、実行可能ファイルを生成するリンクがあります.
解析対象ファイル:ファイルに格納されているのはマシンコードで、マシンコードの中で他のファイルの関数や変数に参照されているアドレスは解析されず、リンクプログラムの時にこれらのアドレスを書き込む.
オブジェクトファイルの生成:-cパラメータはオブジェクトファイルの生成に使用されます.
--killを生成します.oオブジェクトファイル:gcc-Wall-c kill.c,killが生成する.oファイル、このオブジェクトファイルにはkillメソッドが参照され、このメソッドに対応するアドレスは解析されていない.
mainを生成します.oオブジェクトファイル:
gcc -Wall -c mian.c,mainを生成する.oファイル;
リンク先ファイル:gcc main.o kill.o-o mainコマンド、リンクmain.oとkill.o 2つのオブジェクトファイル;
--いいえ-Wallパラメータ:リンクプログラムには2つの結果しかありません.成功または失敗、警告メッセージはありません.
--リンク:gccのldリンクはオブジェクトファイルをリンクするために使用されます.
オブジェクトファイルのリンク順序:ほとんどのコンパイラは任意に順序を並べることができますが、リンク順序に注意する必要があるコンパイラもあります.
--コンパイラとコネクタの順序:コンパイラとリンクの検索外部関数は左から右へ検索されます.
--ファイル順序:関数を定義するオブジェクトファイルより先に関数を呼び出すオブジェクトファイル、ここmain.o killにいるはずだ.o以前;
--エラーチェック:プログラムをコンパイルするときに、すべてのファイルがリストされていますが、定義されていないエラーが発生した場合は、ファイルの配置に注意する必要があります.
ファイルの変更プロセス:ファイルを変更した後、このファイルを再コンパイルするだけで、この新しいコンパイルされたオブジェクトファイルを元のオブジェクトファイルとリンクして、新しい実行可能ファイルを生成することができます.
--再コンパイル:ファイルを変更した後、このファイルをオブジェクトファイルに再コンパイルするだけです.
--再リンク:新しくコンパイルされたオブジェクトファイルを、以前にコンパイルされた他のソースファイルのオブジェクトファイルにリンクすればよい.
,
コンパイルプロセスの概要:C言語のソースファイルを実行可能ファイルにコンパイルするには4つのステップが必要で、前処理(Preprocessing)拡張マクロ、コンパイル(compilation)はアセンブリ言語を得て、アセンブリ(assembly)はマシンコードを得て、接続(linking)は実行可能ファイルを得る;
--各ステップのコンパイルの詳細を表示します:「-E」は前処理に対応し、「-S」はコンパイルに対応し、「-c」はアセンブリに対応し、「-O」は接続に対応します.
--各ステップに対応するツール:プリプロセッサ(CPP-The C Preprogressor)、コンパイラ(cc 1)、アセンブリ(as)、コネクタ(ld);
--全体的なコンパイルの詳細を表示する:「-v」パラメータを使用して、全体的なコンパイルの詳細を表示します.
octopus@octopus:~/test$ gcc -v main.c
specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6/lto-wrapper
:i686-linux-gnu
:../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
:posix
gcc 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=i686'
/usr/lib/gcc/i686-linux-gnu/4.6/cc1 -quiet -v -imultilib . -imultiarch i386-linux-gnu main.c -quiet -dumpbase main.c -mtune=generic -march=i686 -auxbase main -version -fstack-protector -o /tmp/ccUWUvbm.s
GNU C (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 (i686-linux-gnu)
GNU C 4.6.3 , GMP 5.0.2,MPFR 3.1.0-p3,MPC 0.9
GGC :--param ggc-min-expand=100 --param ggc-min-heapsize=131072
“/usr/local/include/i386-linux-gnu”
“/usr/lib/gcc/i686-linux-gnu/4.6/../../../../i686-linux-gnu/include”
#include "..." :
#include <...> :
/usr/lib/gcc/i686-linux-gnu/4.6/include
/usr/local/include
/usr/lib/gcc/i686-linux-gnu/4.6/include-fixed
/usr/include/i386-linux-gnu
/usr/include
。
GNU C (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 (i686-linux-gnu)
GNU C 4.6.3 , GMP 5.0.2,MPFR 3.1.0-p3,MPC 0.9
GGC :--param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 09c248eab598b9e2acb117da4cdbd785
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=i686'
as --32 -o /tmp/cciJfMAd.o /tmp/ccUWUvbm.s
COMPILER_PATH=/usr/lib/gcc/i686-linux-gnu/4.6/:/usr/lib/gcc/i686-linux-gnu/4.6/:/usr/lib/gcc/i686-linux-gnu/:/usr/lib/gcc/i686-linux-gnu/4.6/:/usr/lib/gcc/i686-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.6/:/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/:/usr/lib/gcc/i686-linux-gnu/4.6/../../../../lib/:/lib/i386-linux-gnu/:/lib/../lib/:/usr/lib/i386-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/i686-linux-gnu/4.6/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=i686'
/usr/lib/gcc/i686-linux-gnu/4.6/collect2 --sysroot=/ --build-id --no-add-needed --as-needed --eh-frame-hdr -m elf_i386 --hash-style=gnu -dynamic-linker /lib/ld-linux.so.2 -z relro /usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o /usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crti.o /usr/lib/gcc/i686-linux-gnu/4.6/crtbegin.o -L/usr/lib/gcc/i686-linux-gnu/4.6 -L/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu -L/usr/lib/gcc/i686-linux-gnu/4.6/../../../../lib -L/lib/i386-linux-gnu -L/lib/../lib -L/usr/lib/i386-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/i686-linux-gnu/4.6/../../.. /tmp/cciJfMAd.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-linux-gnu/4.6/crtend.o /usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crtn.o
1.前処理
前処理コマンド:ソースプログラムで「#」で始まるコマンドは、「#include」、「#define」、「ifndef」などの前処理コマンドです.
前処理プロセス:前処理はincludeのファイルをソースファイルに挿入し、defineマクロ定義を展開し、条件に基づいてコードをコンパイルする.
次のソースプログラムをコンパイルします.
/*************************************************************************
> File Name: main.c
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: 2014 04 30 17 31 08
************************************************************************/
#include<stdio.h>
#define NUM 5
int main(int argc, char **argv)
{
printf("Hello World ! num = %d
", NUM);
return 0;
}
前処理結果:前処理ソースプログラムで生成された結果は「.i」接尾辞のファイルに格納され、デフォルトでは「.i」接尾辞ファイルはディスクに書き込まれず、「-save-temps」パラメータを加えると、すべての中間ファイルがディスクに保存されます.
--以下の例を分析する:gcc-save-temps mainを用いる.cコマンドはソースプログラムをコンパイルして、すべての中間ファイルは保留して、main.iは前処理結果、main.sはコンパイル結果、main.oはアセンブリ結果であり、a.outは接続生成の実行可能ファイルである.
octopus@octopus:~/test$ ls
main.c
octopus@octopus:~/test$ gcc -save-temps main.c
octopus@octopus:~/test$ ls
a.out main.c main.i main.o main.s
octopus@octopus:~/test$ ./a.out
Hello World ! num = 5
前処理の詳細を表示する:gcc-E mianを使用する.cコマンドは、コンパイルの詳細を出力し、千行以上印刷します.ここには部分だけが貼られています.
octopus@octopus:~/test$ gcc -E main.c
# 1 "main.c"
# 1 "<built-in>"
# 1 "< >"
# 1 "main.c"
...
# 1 "/usr/include/stdio.h" 1 3 4
# 28 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 324 "/usr/include/features.h" 3 4
...
# 9 "main.c" 2
int main(int argc, char **argv)
{
printf("Hello World !
");
return 0;
}
マクロ定義はgccコマンドラインで行う:gcc-DNEM=5 mainを用いる.cコマンドは、プログラムでNUMマクロ定義を使用できます.「-DRAM」は、プログラムで「#define NUM 5」を定義することに相当します.
-- main.c内容:
/*************************************************************************
> File Name: main.c
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: 2014 04 30 17 31 08
************************************************************************/
#include<stdio.h>
int main(int argc, char **argv)
{
printf("Hello World ! num = %d
", NUM);
return 0;
}
-- コンパイルプロセス:
octopus@octopus:~/test$ gcc -DNUM=5 main.c
octopus@octopus:~/test$ ./a.out
Hello World ! num = 5
2.コンパイル
コンパイルプロセス:コンパイラはコンパイル段階で順次文法分析、文法分析、コード最適化、記憶分配、コード生成の5つのステップを実行する.
--マルチスキャンスキーム:コンパイラはコードをスキャンするたびに1つの作業しか完了しません.例えば、1回目のスキャンは文法分析のみを行い、2回目のスキャンは文法分析を行い、スキャンは上記の5つのステップを複数回完了します.
中間のアセンブリ中間ファイルを生成する:gcc-S mainを使用する.c上のmainをコンパイルする.cソースプログラム、mianを得ることができます.sアセンブリ言語ファイル、これは生成された中間アセンブリプログラムである.
--コンパイルプロセスと結果:
octopus@octopus:~/test$ gcc -S main.c
octopus@octopus:~/test$ cat main.s
.file "main.c"
.section .rodata
.LC0:
.string "Hello World ! num = %d
"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $16, %esp
movl $.LC0, %eax
movl $5, 4(%esp)
movl %eax, (%esp)
call printf
movl $0, %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
.section .note.GNU-stack,"",@progbits
octopus@octopus:~/test$
3.アセンブリ
アセンブリプロセス:アセンブリはアセンブリ言語コードをマシンコード、すなわち「.o」接尾辞のオブジェクトファイルに翻訳し、アセンブリasを使用して実現する.
中間ファイルの取得:「-c」オプションは、アセンブリ中の「.o」接尾辞の中間ファイルを保持し、gcc-c mainを使用することができる.cコマンド、mainを取得できます.oオブジェクトファイル;
octopus@octopus:~/test$ ls
main.c
octopus@octopus:~/test$ gcc -c main.c
octopus@octopus:~/test$ ls
main.c main.o
4.接続
リンクプロシージャ:ldコネクタを使用して、アセンブリ中に生成された「.o」オブジェクトファイルを他のオブジェクトファイルとライブラリファイルに接続し、実行可能なバイナリファイルを生成します.
接続例:gcc mainを使用する.oアセンブリプロセスで生成するオブジェクトファイルmain.o、実行可能ファイルa.outを生成する.
octopus@octopus:~/test$ gcc main.o
octopus@octopus:~/test$ ./a.out
Hello World ! num = 5
二.Cプログラムのコンパイル
1.単一Cプログラムのコンパイル
C言語プログラム例:簡単なHello World;
/*************************************************************************
> File Name: main.c
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: 2014 04 19 16 22 26
************************************************************************/
#include<stdio.h>
int main(int argc, char **argv)
{
printf("Hello World!
");
return 0;
}
単純コンパイル:使用シヨウ
gcc main.cコマンド、a.out実行可能ファイルが生成され、./a.outはコンパイルされたCプログラムを実行することができる.
octopus@octopus:~/gcc$ gcc main.c
octopus@octopus:~/gcc$ ./a.out
Hello World!
出力ファイルコンパイルの指定:a.outを出力ファイルとして使用したくない場合は、-oパラメータを使用して出力ファイルを指定し、そのファイルが存在する場合は上書きします.
--コマンド:gcc main.c -o main;
octopus@octopus:~/gcc$ gcc main.c -o main
octopus@octopus:~/gcc$ ./main
Hello World!
警告オプションを表示します:-Wallオプション、コンパイル時に警告情報を端末に出力することができます;
--出力警告情報のコンパイル:gcc-Wall main.c;
人為的な製造警告:printf出力時に、intデータのプレースホルダとして%sを使用します.
/*************************************************************************
> File Name: main.c
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: 2014 04 19 16 22 26
************************************************************************/
#include<stdio.h>
int main(int argc, char **argv)
{
printf("Hello World! num = %s
", 4);
return 0;
}
-- コンパイルの実行:
gcc -Wall main.c,コンパイル時に警告を出したが,コンパイルは通過したが,実行時にエラーが発生した.
octopus@octopus:~/gcc$ gcc main.c
main.c: ‘main’ :
main.c:12:2: : ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat]
octopus@octopus:~/gcc$ ./a.out
( )
2.複数のファイルのコンパイル
3つのファイルからなるプログラム:kill.h, kill.c, main.c,main.cはメイン関数のエントリでkillを呼び出す.c定義の方法;
-- kill.h内容:killメソッドを宣言し、このヘッダファイルを参照するとkillメソッドを使用できます.
/*************************************************************************
> File Name: kill.h
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: 2014 04 19 20 51 59
************************************************************************/
#ifndef KILL
int kill(char *);
#endif
-- kill.c内容:主にkillを実現する.hで宣言されたkillメソッド;
/*************************************************************************
> File Name: kill.c
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: 2014 04 19 20 53 53
************************************************************************/
#include<stdio.h>
int kill(char *ch)
{
printf("%s
", ch);
return 0;
}
-- mian.c内容:kill.hライブラリ;
/*************************************************************************
> File Name: main.c
> Author: octopus
> Mail: octopus_work.163.com
> Created Time: 2014 04 19 16 22 26
************************************************************************/
#include<stdio.h>
#include"kill.h"
int main(int argc, char **argv)
{
printf("Hello World!
");
kill("fuck");
return 0;
}
ヘッダファイルライブラリ記号の違い:#include"kill.h"#include
--#include"kill.h":まず現在のディレクトリでkillを検索します.hヘッダファイル、システムにおいて当該ヘッダファイルを検索する;
-- #include
ファイルのコンパイル:gcc-Wall mainを使用します.c kill.c-o killはコンパイルを行う.
octopus@octopus:~/gcc$ gcc -Wall main.c kill.c -o kill
octopus@octopus:~/gcc$ ./kill
Hello World!
fuck
3.独立してファイルをコンパイルする
開発ニーズ:1つのプロジェクトが比較的大きい場合、プロジェクト全体のコンパイル時間は長くなり、1つの関数を変更するとプロジェクト全体を再コンパイルする必要があり、時間を浪費します.
--ソリューション:プログラムは複数のソースファイルに格納され、各ソースファイルは個別にコンパイルされます.
複数のソースファイルを個別にコンパイルするには、まずオブジェクトファイルを生成し、次にオブジェクトファイルリンクを実行可能ファイルを生成します.
--コンパイル対象ファイル:ソースプログラムを実行不可能なファイルにコンパイルし、生成する.o接尾辞のオブジェクトファイル;
--リンクプログラム:gccには、すべてのオブジェクトファイルをリンクし、実行可能ファイルを生成するリンクがあります.
解析対象ファイル:ファイルに格納されているのはマシンコードで、マシンコードの中で他のファイルの関数や変数に参照されているアドレスは解析されず、リンクプログラムの時にこれらのアドレスを書き込む.
オブジェクトファイルの生成:-cパラメータはオブジェクトファイルの生成に使用されます.
--killを生成します.oオブジェクトファイル:gcc-Wall-c kill.c,killが生成する.oファイル、このオブジェクトファイルにはkillメソッドが参照され、このメソッドに対応するアドレスは解析されていない.
octopus@octopus:~/gcc$ gcc -Wall -c kill.c
octopus@octopus:~/gcc$ ls
kill.c kill.h kill.o main.c
-- mainを生成します.oオブジェクトファイル:
gcc -Wall -c mian.c,mainを生成する.oファイル;
octopus@octopus:~/gcc$ gcc -Wall -c main.c
octopus@octopus:~/gcc$ ls
kill.c kill.h kill.o main.c main.o
リンク先ファイル:gcc main.o kill.o-o mainコマンド、リンクmain.oとkill.o 2つのオブジェクトファイル;
--いいえ-Wallパラメータ:リンクプログラムには2つの結果しかありません.成功または失敗、警告メッセージはありません.
--リンク:gccのldリンクはオブジェクトファイルをリンクするために使用されます.
octopus@octopus:~/gcc$ gcc main.o kill.o -o main
octopus@octopus:~/gcc$ ./main
Hello World!
fuck
オブジェクトファイルのリンク順序:ほとんどのコンパイラは任意に順序を並べることができますが、リンク順序に注意する必要があるコンパイラもあります.
--コンパイラとコネクタの順序:コンパイラとリンクの検索外部関数は左から右へ検索されます.
--ファイル順序:関数を定義するオブジェクトファイルより先に関数を呼び出すオブジェクトファイル、ここmain.o killにいるはずだ.o以前;
--エラーチェック:プログラムをコンパイルするときに、すべてのファイルがリストされていますが、定義されていないエラーが発生した場合は、ファイルの配置に注意する必要があります.
ファイルの変更プロセス:ファイルを変更した後、このファイルを再コンパイルするだけで、この新しいコンパイルされたオブジェクトファイルを元のオブジェクトファイルとリンクして、新しい実行可能ファイルを生成することができます.
--再コンパイル:ファイルを変更した後、このファイルをオブジェクトファイルに再コンパイルするだけです.
--再リンク:新しくコンパイルされたオブジェクトファイルを、以前にコンパイルされた他のソースファイルのオブジェクトファイルにリンクすればよい.
,