GCC 编译工具入门教程(2)

执行gcc -c hello.s -o hello.o命令。而生成的hello.o文件是二进制文件,我们用od -b hello.o命令看一下该二进制文件的八进制表示。

➜ test od -b -w8 hello.o 0000000 177 105 114 106 002 001 001 000 0000010 000 000 000 000 000 000 000 000 0000020 001 000 076 000 001 000 000 000 0000030 000 000 000 000 000 000 000 000 .......... 0002710 000 000 000 000 000 000 000 000 0002720 001 000 000 000 000 000 000 000 0002730 000 000 000 000 000 000 000 000 0002740 // -b:八进制形式,1字节为1部分。 // -w8:每行显式8字节。 4.5 链接过程

链接hello.o程序运行的所需要的目标文件,以及依赖的库文件,最后生成可执行文件。

执行gcc hello.o -o hello不需要选项,生成hello二进制的可执行文件。同样可以使用od命令来查看。执行hello文件:

➜ test ./hello hello world

以上编译过程的分步骤进行,还可以直接执行gcc hello.c -o hello直接生成可执行文件。

至此,使用gcc编译程序的过程就介绍完毕。

5. GCC 编译多文件

main.c

#include "hello.h" int main(void) { print("hello world"); return 0; }

hello.c

#include "hello.h" void print(const char *str) { printf("%s\n", str); }

hello.h

#ifndef _HELLO_H #define _HELLO_H #include <stdio.h> void print(const char *str); #endif 5.1 一次性编译

执行gcc -Wall hello.c main.c -o main命令,直接生成可执行文件main

➜ test gcc -Wall hello.c main.c -o main ➜ test ./main hello world 5.2 独立编译

先分别将main.c和hello.c编译生成main.o和hello.o文件。然后将两个.o文件链接生成可执行文件newmain。

➜ test gcc -Wall -c main.c -o main.o ➜ test gcc -Wall -c hello.c -o hello.o ➜ test gcc -Wall hello.o main.o -o newmain ➜ test ./newmain hello world

独立编译的好处就是,如果我们的代码发生更改,只需要独立编译更改的文件,最后在一起链接生成可执行文件。

外部库、共享库、静态库、动态库 1. 头文件与库文件

在使用C语言和其他语言进行程序设计时,需要头文件来提供对常数的定义和对系统及函数调用的声明。

库文件是一些预先编译好的函数集合,那些函数都是按照可重用原则编写的。他们通常有一组互相关联的用来完成某项常见工作的函数构成。比如用来处理屏幕显式情况的函数(ncurses库)和数据库访问例程(dbm库)等。

使用库的好处:

模块化:将不同功能模块的文件编译成不同的库,有利用明确项目之间的分工。

可重用性高:无需关心内部实现,直接调用即可。

可维护性:当库文件的代码发生改变,无需更改使用库文件的代码,增强代码的可维护性。

2. 头文件与库文件的位置

/usr/include 及其子目录底下的 include 文件夹

/usr/loacl/include 及其子目录底下的 include 文件夹

/usr/lib

/usr/local/lib

3. 使用外部库(-l选项)

如下面这个例子:

#include <math.h> #include <stdio.h> int main(void) { double d = pow(2.0, 4.0); printf("The cubed is %f\n", d); return 0; }

我们想使用math.h库中的pow()函数,因此在编译时,需要连接对应的库。执行如下命令:

➜ test gcc -Wall calc.c -o calc -lm ➜ test ./calc The cubed is 16.000000

其中-lm表示要链接libm.so或者libm.a库文件。

4. 静态库与共享库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候不再需要静态库。静态库会被链接到可执行文件中,比较占用磁盘空间,并且执行时会将库的代码加载到内存,占用更多的内存,并且多个程序无法共享。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/47853e0ee09b3bf7731df970b1461e18.html