程序编译与函数库

程序编译与函数库

前面提到过对于机器来说只能识别0,1,我们如果让机器运行必须输入机器能够识别的语言,可是机器语言不利于人们使用可理解,因此科学家就开发出人类能看的懂的程序语言,然后再创造出“编译器”将程序语言转换为机器语言。

C语言就是我们能够看懂的机器语言,gcc就是Linux下编译器。我们通常C语言写的程序通过gcc编译后,就能成为机器能够识别的语言

gcc程序编译
如果LINUX 系统中为安装GCC编译器,可以使用下面命令安装

[root@bogon ~]# yum install gcc

gcc常用语法
语法:

gcc  –c  file.c

仅将源代码编译成目标文件。并不会进行链接以及生成可执行文件

gcc –o 执行文件名 源代码文件

直接生成指定名称的执行文件。但不会生成目标文件

gcc –o 执行文件名 目标文件

通过目标文件生成可执行文件

gcc [其他编译操作]  –L库文件路径

查找库文件的路径默认是/usr/lib 与/ib

gcc  [其他编译操作] –I包含文件路径

查找包含文件的路径默认是/usr/include

gcc  [其他编译操作] –Wall

更加严谨的编译方式,会输出很多警告信息

gcc  -O  [其他编译操作]

编译时依据操作环境优化执行速度

gcc  [其他编译操作] –l库文件名称

编译时引入其他的库文件,其中库文件lib与扩展名不需要写。如引入libm.so文件,可写成-lm

单一程序编译
 

1.      编写C语言程序l

[root@bogon code]# vim hello.c
#include <stdio.h>
int main(void)
{
  printf("hello world!");
}
 

2.      编译

[root@bogon code]# gcc hello.c
[root@bogon code]# ll hello.c a.out
-rwxr-xr-x 1 root root 4947 04-05 16:07 a.out
-rw-r--r-- 1 root root  66 04-05 16:07 hello.c
 

说明:默认gcc编译器编译出来的执行文件a.out, 可以使用-o来制定编译后生产的执行文件名称

[root@bogon code]# gcc -o hello hello.c
[root@bogon code]# ll hello
-rwxr-xr-x 1 root root 4947 04-05 16:11 hello
 

3.      执行

[root@bogon code]# ./a.out
hello world!

[root@bogon code]# ./hello
hello world!
 

多文件程序编译
假设我们有A.c ,B.c两个程序文件,并且他们之间存在函数调用,那么当其中有一个文件更改了。是不是需要将这两个文件都重新编译?当然不需要,这就需要引入目标文件

目标文件:编译器编译源代码后生成的文件,目标文件从结构上讲,它是已经编译后的可执行文件格式,只是没有经过链接的过程。

接着上面的说,当B.c文件更改时,我们执行重新编译B文件生产目标文件。再讲整体链接即可

1.      编写C语言程序

File:A.c
#include <stdio.h>
#include “B.c”
int main ()
{
printf("这是第一个文件\n");
method();
}

File:B.c
#include <stdio.h>
void method(void)
{
 printf("这是第二个文件!\n";)
}2.      编译

root@bogon code]# gcc -c A.c B.c -I./
[root@bogon code]# ll
-rw-r--r-- 1 root root  81 04-05 16:35 A.c
-rw-r--r-- 1 root root  912 04-05 16:35 A.o
-rw-r--r-- 1 root root  80 04-05 16:34 B.c
-rw-r--r-- 1 root root  860 04-05 16:35 B.o3.    链接

[root@bogon code]# gcc -o result A.o B.o4.      执行

[root@bogon code]# ./result
这是第一个文件
这是第二个文件!5.  更改B.c文件

#include <stdio.h>
void method(void)
{
 printf("这是更改后第二个文件!\n";)
}6.      重新编译链接执行

[root@bogon code]# gcc -c B.c =>只编译了B这个文件
[root@bogon code]# gcc -o result A.o B.o
[root@bogon code]# ./result
这是第一个文件
这是更改后第二个文件!
 

调用外部函数库
 
1.      编写C语言程序

#include<stdio.h>
#include<math.h>
 
int main ()
{
  float val=sin(3.14);
  printf("val值是:%f\n",val);
}2.      编译与执行

[root@bogon code]# gcc -o sinmath sinmath.c -lm
[root@bogon code]# ./sinmath
val值是:0.001593
 

函数库介绍
函数库依照是否编译到程序内部可分为

静态函数库:通常以.a为扩展名,编译时会整合到程序文件中

动态函数库:通常以.so为扩展名,编译时会不会整合到程序文件中,只是在程序文件中存在一个指向的位置

因此程序执行时是不需要静态函数库的,但是需要动态函数库,使用动态函数库的好处再在可以减少程序文件的大小

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

转载注明出处:http://www.heiqu.com/18693.html