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
本文来自博客园,作者:klaus08,转载请注明原文链接:https://www.cnblogs.com/klaus08/p/15105026.html