和我一起迎接明天的太阳吧

klaus08

焦虑源于行动的匮乏

Linux编译C语言程序

前面在这篇文章中描述了编译型语言与解释型语言的区别.
今天记一下C语言的具体编译.


编译语言需要编译器进行.c语言使用的是gcc.
在Linux中,如果想要编译一个c程序,主要命令如下,其中a.c就是c的源码.
options是gcc的一些选项.

gcc -[options] a.c

c语言编译主要有预处理,编译(compile),汇编和链接.
过程(及命令)操作(及结果)
预处理( gcc -E a.c)将头文件,宏定义等细化,去掉注释 (得到a.i)
编译 ( gcc -S a.c)生成对应的汇编语言(所以汇编语言编译时只有下面两步) (得到a.s)
汇编 ( gcc -c a.c)将汇编语言转化成机器识别的机器码 (得到a.o)
链接 ( gcc -o a.c)生成可执行文件 (得到a.out)

准确来说 gcc -o命令是将文件输出到指定文件file中.所以说在预处理,编译,汇编阶段都可以使用gcc -o得到对应的文件.


还有关于gcc的其他命令选项:

gcc -I PATH将PATH添加到头文件搜索路径
gcc -L PATH将PATH添加到库文件的搜索路径
gcc -labc链接名为abc的库文件

自定义头文件

以a.c为例, 下面是a.c的内容

#include<stdio.h>

int main()
{
		printf("Hello World!\n");
		return 0;
}

如果我们要得到a.c对应可执行文件的话, 只需要gcc -o hello a.c这样就可以了,就得到了名为hello的可执行文件.

//得到汇编文件
gcc -S a.c
//得到二进制文件
gcc -c a.c

注意到,前面是使用了<stdio.h>头文件 ,编译时会到/usr/include/或/lib路径中寻找,如果我们想要用自己定义的头文件head.h的话,两种方法
1.在源码中以include "head.h"引用头文件, 并将head.h添加到和源码同一路径下. 不在同一路径下就要用gcc -I指明head.h的路径
2.在源码中以include <head.h>引用头文件, 并使用gcc -I命令指定head.h的路径

函数库

静态函数库

这里晕晕的.
c语言通过头文件调用相关函数. 但是呢头文件里只有函数和变量的声明. 而函数(extern 声明)的定义呢在对应的库文件中(都是以lib开头 .a或.so结束, 如libm.a就是math.h的库函数定义所在). 由于产权原因或者其他的, 库函数里函数的定义都是类似于gcc -c命令产生的二进制文件无法界面化展示.

这里有个例子,lib.h是头文件,pro1,pro2是头文件包含的函数.具体函数库libfoo.a的生成如下:
ar是 ar crv libfoo.a pro1.o pro2.o
在这里插入图片描述

posted @ 2020-03-28 20:25  klaus08  阅读(133)  评论(0编辑  收藏  举报