C语言编译器

时间:2022-10-19 02:04:41

一、《Linux程序设计》

(一)

1.Gun c/cc++编译器的各个工具和GNU专用的头文件都保存在/usr/lib/gcc的子目录里

2.对c语言来说,头文件位于/usr/include目录及其子目录中

3.用-I(大写的i)包含保存在子目录或非标准位置中的头文件,如:

gcc -I/usr/opemwin/include  fred.c

它指示编译器不仅在标准位置,也在/usr/openwin/inclde目录中查找程序fred.c中2包含的头文件   ,更多用法:man gcc

4.巧用grep,如搜索返回退出状态的#define定义的名字,前提是切换到/usr/include目录下

grep  EXIT_  *.h   

(二)

1.标准系统库文件一般在/lib和/usr/lib目录中

c代表c库,m代表数学库       .a:传统的静态函数库       .so:共享函数库

函数库:(1)静态库  (2)共享库   可用ls  /usr/lib查看

2.gcc  -o  fred  fred.c  /usr/lib/libm.a

编译器编译文件fred.c,将编译后产生的程序文件命名为fred,并且除了搜索标准的c语言函数库外,还搜索数学库以解决函数引用问题

gcc  -o  fred  fred.c  -lm

-lm;标准函数库中名为libm.a的函数库,-lmm标志的另一个好处是如果有共享库,编译器会自动选择共享库

3.用-L增加库的搜索路径,如:

gcc  -o  x11.fred   -L/usr/openwin/lib  xllfed.c  -lx11

这条命令用/usr/openwin/lib目录中的libx11库版本编译和链接程序x11fred

4.创建一个小型函数库

(1)为函数(bill、fred)创建各自的源文件(也就是子函数)

第一个源文件:

#include<stdio.h>

void  fred(int  arg)

{

     printf("fred:  we  passed  %d\n", arg);

}

第二个源文件:

#include<stdio.h>

void  bill(char  *arg)

    printf("bill:  we  passed  %s\n", arg);

}

(2)gcc  -c  bill.c  fred.c       -c:阻止编译器创建一个完整的程序,因为此时还未定义main函数

ls  *.o

bill.o     fred.o

(3)编写一个调用bill函数的程序。首先,为库文件创建一个头文件,这个头文件将声明库文件中的函数,所有希望使用这个库文件的应用程序包含这个头文件,fred.c和bill.c里包含这个头文件

     void  bill(char *);

     void  fred(int);

(4)调用程序(program.c)它包含头文件并且调用库中的一个函数

#include<stdlib.h>

#include  "lib.h"

int  main()

{  

     bill("Helo  World");

     exit(0);

}

(5)编译测试程序,为编译器指定目标文件,要求编译器编译program.c并与先前编译好的目标模块bill.o链接

gcc  -c  program.c

gcc  -o  program  program.c  bill.o

./program

bill:  we  passed  Hello  World

(6)创建并使用一个库文件。用ar程序创建一个归档文件并将目标文件添加进去。注意:ar程序可以用来创建任何类型文件的归档文件

ar  crv  libfoo.a  bill.o  fred.o

显示的内容:a  -  bill.o

                     a  -  fred.o

(7)在某些系统中,尤其是从Berkeley UNIX衍生的系统中,要想成功地使用函数库,还需要为函数库生成一个内容表。可以用ranlib命令来完成。在Linux中,当使用的是GNU的软件开发工具时,这一步骤可省略(做了也无妨)

ranlib  libfoo.a

现在可以使用函数库了

gcc  -o  program  program.o  libfoo.a

./program

显示的内容;bill: we  passed  Hello  World

5.可以用-l访问函数库,但因其未保存标准位置,所以必须使用-L告诉编译器在何处可以找到它

gcc  -o  program  program.o  -L.  -lfoo

若要查看哪些函数被包含在目标文件、函数库或可执行文件里,可以使用nm命令

6. 共享库

/usr/lib/libm.so