GCC: GNU C Compiler, 其中GNU:GNU Not Unix, 1984年成立 其创建者Richaard Stallman。 GCC于1987年诞生,
http://gcc.gnu.org/, gcc可以编译gcc的软件, 即可以gcc来编译自己的软件, 因为它自己也是C语言写的软件
C、C++可以直接访问计算机的内存,一般对资源控制要求很高的地方可以使用C和C++。如果你想精通计算机,请喜欢C; 如果喜欢C, 那就请喜欢指针; 如果喜欢指针,那就请喜欢指针的指针。
第一个实例hello:
/*
* hello.c - Canonical "Hello, World!" program
*/
#include <stdio.h>
int main(void)
{
printf("Hello,Linux programming world!\n");
return 0;
}
在命令行上键入以下命令编译和运行这段程序:
$ gcc hello.c -o hello
$./hello
Hello, Linux programming world!
(在编译时,如果出现乱码,用export LANG=C)
第一行命令告诉gcc对源代码hello.c进行编译和链接,并使用-o参数指定创建名为hello的可见程序.第二行命令执行hello这个程序,第三行是程序的执行结果.
其实,gcc首先运行预处理程序cpp来展开hello.c中的宏并在其中插入#include文件所包含的内容:然后把预处理后的源代码编译成为目标代码;最后,链接程序ld创建一个名为hello的二进制文件.
现在我们来通过手工操作重新创建这些步骤,以逐步执行编译过程.第一布是运行预处理器.使用-E选项告诉gcc在预处理后停止编译过程:
$gcc -E hello.c -o hello.cpp
此时查看hello.cpp会发现stdio.h的内容确实都插到文件里去了,而其他应当被预处理的标记也做了类似处理.
下一步是将hello.cpp编译为目标代码.可使用gcc的-c选项来完成:
$gcc -x cpp-output -c hello.cpp -o hello.o
-x选项告诉gcc从指定的步骤开始编译,在本例中也就是编译器处理后的源代码(cpp-output).
gcc是怎么知道如何处理某种特殊类型的文件呢?它是依靠文件的扩展名来决定如何正确处理该文件的.
——————————————————————————————
扩展名 类型
.c C语言源代码
.C,.cc C++语言源代码
.i 预处理后的C源代码
.ii 预处理后的C++源代码
.S,.s 汇编语言源代码
.o 编译后的目标代码
.a,.so 编译后的库代码
———————————————————————————————
最后,链接目标文件,生成二进制代码.
$gcc hello.c -o hello
其实,gcc首先运行预处理程序cpp来展开hello.c中的宏并在其中插入#include文件所包含的内容:然后把预处理后的源代码编译成为目标代码;最后,链接程序ld创建一个名为hello的二进制文件.
现在我们来通过手工操作重新创建这些步骤,以逐步执行编译过程.第一布是运行预处理器.使用-E选项告诉gcc在预处理后停止编译过程:
$gcc -E hello.c -o hello.cpp
此时查看hello.cpp会发现stdio.h的内容确实都插到文件里去了,而其他应当被预处理的标记也做了类似处理.
下一步是将hello.cpp编译为目标代码.可使用gcc的-c选项来完成:
$gcc -x cpp-output -c hello.cpp -o hello.o
-x选项告诉gcc从指定的步骤开始编译,在本例中也就是编译器处理后的源代码(cpp-output).
gcc是怎么知道如何处理某种特殊类型的文件呢?它是依靠文件的扩展名来决定如何正确处理该文件的.
——————————————————————————————
扩展名 类型
.c C语言源代码
.C,.cc C++语言源代码
.i 预处理后的C源代码
.ii 预处理后的C++源代码
.S,.s 汇编语言源代码
.o 编译后的目标代码
.a,.so 编译后的库代码
———————————————————————————————
最后,链接目标文件,生成二进制代码.
$gcc hello.c -o hello
附:
gcc -Wall hello.c -o hello, 其中Wall表示为,W:Warning, all:所有的, 即将所有的警告都打印出来, 方便调试
gcc --version:查看gcc编译器的版本
如果需要安装GCC, 步骤如下:
1.下载gcc
[url]http://gcc.gnu.org/[/url]
2.解压缩
[url]http://gcc.gnu.org/[/url]
2.解压缩
#tar xzvf gcc-3.4.0.tar.gz 或者
# bzcat gcc-3.4.0.tar.bz2 | tar xvf -
3.建立安装目录
#mkdir /usr/local/gcc_3.4.0
4.编译
#cd gcc_3.4.0_install
#configure --prefix=/usr/local/gcc_3.4.0
#make
(时间很长)
5.安装
#make install
6.配置
#cd /usr/bin
#ln -s /usr/local/gcc_3.4.0/bin/gcc gcc34
#ln -s /usr/local/gcc_3.4.0/bin/g++ g++34
#ln -s /usr/local/gcc_3.4.0/bin/gcj gcj34
#set LD_LIBRARY_PATH /usr/local/gcc_3.4.0/lib:$LD_LIBRARY_PATH
# bzcat gcc-3.4.0.tar.bz2 | tar xvf -
3.建立安装目录
#mkdir /usr/local/gcc_3.4.0
4.编译
#cd gcc_3.4.0_install
#configure --prefix=/usr/local/gcc_3.4.0
#make
(时间很长)
5.安装
#make install
6.配置
#cd /usr/bin
#ln -s /usr/local/gcc_3.4.0/bin/gcc gcc34
#ln -s /usr/local/gcc_3.4.0/bin/g++ g++34
#ln -s /usr/local/gcc_3.4.0/bin/gcj gcj34
#set LD_LIBRARY_PATH /usr/local/gcc_3.4.0/lib:$LD_LIBRARY_PATH
编译的整个过程:
1、cpp
[china@136_20 demo01]$ which cpp
/usr/bin/cpp
[china@136_20 demo01]$ cpp helloworld.c > helloworld.i
/usr/bin/cpp
[china@136_20 demo01]$ cpp helloworld.c > helloworld.i
2、gcc,生成汇编代码,以.s结尾
[china@136_20 demo01]$ gcc -Wall -S helloworld.i
[china@136_20 demo01]$ ll
total 36
-rwxrwxr-x 1 china china 6724 Jul 25 13:27 helloworld
-rwxrwxr-x 1 china china 155 Jul 25 13:26 helloworld.c
-rw-rw-r-- 1 china china 17575 Jul 25 15:11 helloworld.i
-rw-rw-r-- 1 china china 908 Jul 25 15:13 helloworld.s
[china@136_20 demo01]$ ll
total 36
-rwxrwxr-x 1 china china 6724 Jul 25 13:27 helloworld
-rwxrwxr-x 1 china china 155 Jul 25 13:26 helloworld.c
-rw-rw-r-- 1 china china 17575 Jul 25 15:11 helloworld.i
-rw-rw-r-- 1 china china 908 Jul 25 15:13 helloworld.s
3、as, assembler, 将汇编代码转换成机器码,并且生成目标文件, 以.o结尾
[china@136_20 demo01]$
as helloworld.s -o helloworld.o
[china@136_20 demo01]$ ll
total 40
-rwxrwxr-x 1 china china 6724 Jul 25 13:27 helloworld
-rwxrwxr-x 1 china china 155 Jul 25 13:26 helloworld.c
-rw-rw-r-- 1 china china 17575 Jul 25 15:11 helloworld.i
-rw-rw-r-- 1 china china 1512 Jul 25 15:16 helloworld.o
-rw-rw-r-- 1 china china 908 Jul 25 15:13 helloworld.s
[china@136_20 demo01]$ ll
total 40
-rwxrwxr-x 1 china china 6724 Jul 25 13:27 helloworld
-rwxrwxr-x 1 china china 155 Jul 25 13:26 helloworld.c
-rw-rw-r-- 1 china china 17575 Jul 25 15:11 helloworld.i
-rw-rw-r-- 1 china china 1512 Jul 25 15:16 helloworld.o
-rw-rw-r-- 1 china china 908 Jul 25 15:13 helloworld.s
4、用linker链接文件, 链接系统库和c语言的运行库crt, 默认生成a.out
[china@136_20 demo01]$ gcc helloworld.o
[china@136_20 demo01]$ ll
total 48
-rwxrwxr-x 1 china china 6724 Jul 25 15:22 a.out
-rwxrwxr-x 1 china china 6724 Jul 25 13:27 helloworld
-rwxrwxr-x 1 china china 155 Jul 25 13:26 helloworld.c
-rw-rw-r-- 1 china china 17575 Jul 25 15:11 helloworld.i
-rw-rw-r-- 1 china china 1512 Jul 25 15:16 helloworld.o
-rw-rw-r-- 1 china china 908 Jul 25 15:13 helloworld.s
[china@136_20 demo01]$ ll
total 48
-rwxrwxr-x 1 china china 6724 Jul 25 15:22 a.out
-rwxrwxr-x 1 china china 6724 Jul 25 13:27 helloworld
-rwxrwxr-x 1 china china 155 Jul 25 13:26 helloworld.c
-rw-rw-r-- 1 china china 17575 Jul 25 15:11 helloworld.i
-rw-rw-r-- 1 china china 1512 Jul 25 15:16 helloworld.o
-rw-rw-r-- 1 china china 908 Jul 25 15:13 helloworld.s
[china@136_20 demo01]$
gcc -Wall -v helloworld.o
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=x86_64-redhat-linux
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)
/usr/libexec/gcc/x86_64-redhat-linux/4.1.2/collect2 --eh-frame-hdr -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.1.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.1.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 helloworld.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crtn.o
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=x86_64-redhat-linux
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)
/usr/libexec/gcc/x86_64-redhat-linux/4.1.2/collect2 --eh-frame-hdr -m elf_x86_64 --hash-style=gnu -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbegin.o -L/usr/lib/gcc/x86_64-redhat-linux/4.1.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.1.2 -L/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 helloworld.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtend.o /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crtn.o
5、执行a.out
[china@136_20 demo01]$ ./a.out
Hello,Linux programming world!
Hello,Linux programming world!
查看生成的文件属性:
[china@136_20 demo01]$ file a.out
a.out: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
[china@136_20 demo01]$ file helloworld.c
helloworld.c: ASCII C program text
[china@136_20 demo01]$ file helloworld.o
helloworld.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
a.out: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
[china@136_20 demo01]$ file helloworld.c
helloworld.c: ASCII C program text
[china@136_20 demo01]$ file helloworld.o
helloworld.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
查看要运行程序需要哪些动态库
[china@136_20 demo01]$ ldd a.out
libc.so.6 => /lib64/libc.so.6 (0x0000003515000000)
/lib64/ld-linux-x86-64.so.2 (0x0000003514c00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003515000000)
/lib64/ld-linux-x86-64.so.2 (0x0000003514c00000)
本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/266999,如需转载请自行联系原作者