gcc的使用方法
gcc [选项] 文件名
一、gcc常用选项:
-v :查看gcc编译器的版本,显示gcc执行时的详细过程
-o :指定输出文件名为file,这个名称不能跟源文件名同名
-E :只预处理,不会编译、汇编、链接
-S :只编译,不会汇编、链接
-c : 编译和汇编,不会链接
1. -o :指定输出文件名为file,这个名称不能跟源文件名同名
gcc test.c -o hello
或者
gcc -o hello test.c
2. -E:只预处理,展开宏定义,但不会编译、汇编、链接
gcc -E test.c -o test.i
或者
gcc -E test.c
或者
gcc -E -o hello.i hello.c
3. -S:只编译,不会汇编、链接。生成汇编代码
gcc -S test.i -o test.s
4. -c : 编译和汇编,不会链接
gcc -c test.s -o test.o
或者
gcc -c -o test.o test.c //一步到位
- 可链接方法
gcc会对.c文件默认进行预处理操作,-c再来指明了编译、汇编,从而得到.o文件。再通过gcc -o hello hello.o将.o文件进行链接,得到可执行应用程序。gcc -c -o hello.o hello.c 和 gcc -o hello hello.o
小结
1)输入文件的后缀名和选项共同决定gcc到底执行那些操作。
2)在编译过程中,除非使用了-E、-S、-c选项(或者编译出错阻止了完整的编译过程) 否则最后的步骤都是链接。
- 什么是链接?
链接就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来,
最终生成可以在特定平台运行的可执行程序。
- -lc:链接libc库文件,其中libc库文件中就实现了printf等函数。
- -nostdlib :不链接系统标准启动文件和标准库文件,只把特定的文件传给连接器。这个选项常用于编译内核,bootloader等程序,他们不需要启动文件,标准库文件
gcc -v -nostdlib -o hello hello.o
会提示因为没有链接系统标准启动文件和标准库文件,而链接失败。这个-nostdlib选项常用于裸机/bootloader、linux内核等程序,因为它们不需要启动文件、标准库文件。
- 一般应用程序才需要系统标准启动文件和标准库文件。裸机/bootloader、linux内核等程序不需要启动文件、标准库文件。
- 什么是静态链接?
动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。
什么是动态链接?
而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。一般情况下,如果一个应用程序使用了动态链接库,Win32系统保证内存中只有DLL的一份复制品
- 动态链接使用动态链接库进行链接,生成的程序在执行的时候需要加载所需的动态库才能运行。动态链接生成的程序体积较小,但是必须依赖所需的动态库,否则无法执行。
静态链接使用静态库进行链接,生成的程序包含程序运行所需要的全部库,可以直接运行,不过静态链接生成的程序体积较大。