1.自定义头文件
在C中,编写的头文件如果不在标准头文件目录中是无法使用尖括号包括的,只能使用""包括,例如:
#include"目录/头文件名"
或者如果头文件在需要编译的文件的当前目录下,可以不用加目录名
#include"头文件名"
2.使用尖括号包括
如果要使用尖括号包括头文件,有两种方法
1.将头文件移动到标准头文件目录,linux为/usr/local/include.windows下为C:\MinGW\include
2.编译时指定头文件目录,gcc -I/头文件目录 ...... 编译时-I参数就是用于指定头文件目录
3.静态库
将文件编译为静态库,可以将多个目标文件保存为一个存档,在linux中存档命令为"ar",例如
ar -rcs libmylib.a source1.o source2.o
参数r表示如果.a文件存在,则更新它,c表示创建存档时不反馈信息,s表示在.a文件开头建立索引,文档名必须以lib开头,否则编译器无法找到该存档
编译时使用静态库的方法为使用-l参数,如果该静态库处在标准目录(linux下为/usr/local/lib)中,则无需指定目录,如果不在标准目录中,需要使用-L参书指定静态库所处的目录,例如
gcc test.c -L/my_lib -lmylib -o test
3.使用静态库实例
创建头文件hellow.h,how.h,c文件hellow.c,how.c,main.c,以及一个Makefile文件
- hellow.h
void hellow();
- how.h
void how();
做完之后可以将两个头文件移动到标准头文件目录下,如果不移动,后面的makefile文件需要使用-I参数,指定头文件目录为当前目录
- hellow.c
#include<hellow.h>
#include<stdio.h>
void hellow()
{
printf("hellow world\n");
}
- how.c
#include<how.h>
#include<stdio.h>
void how()
{
printf("how are you\n");
}
- main.c
#include<stdio.h>
#include<hellow.h>
#include<how.h>
int main()
{
hellow();
how();
return 0;
}
- Makefile文件
#include<hellow.h>
#include<how.h>
hellow.o:hellow.c
gcc -c hellow.c -o hellow.o
how.o:how.c
gcc -c how.c -o how.o
libgreet.a:hellow.o how.o
ar -rcs libgreet.a hellow.o how.o
run:main.c libgreet.a
gcc main.c -L. -lgreet -o run
- 运行make run
[root@izhqmn61154vmrz libTest]# make run
gcc -c hellow.c -o hellow.o
gcc -c how.c -o how.o
ar -rcs libgreet.a hellow.o how.o
gcc main.c -L. -lgreet -o run
- 运行run
[root@izhqmn61154vmrz libTest]# ./run
hellow world
how are you
- 由上面的实例可以看出,静态库是由不同的目标代码组件而成的,需要先编译.o文件,再创建.a文档,再将它们链接成可执行程序,一旦用这些独立的目标代码创建了可执行程序,就没办法修改组成静态库的目标文件,除非重新编译.o文件,创建.a文档…,这也是它被称为静态库的原因
4.动态库
静态库在生成执行文件后无法修改组成执行文件中的目标代码,而动态库通过将目标代码分别保存在单独的文件中,在程序运行时才将之动态的链接到一起,从而实现了可以修改目标文件的目的
创建动态库
将目标代码转换为动态库之前,需要先将它编译为.o目标文件:
gcc -fPIC -c source.c -o source.o
-fPIC表示想创建位置无关代码,在linux中必须加这个参数,然后创建动态库
gcc -shared source.o -o source.so
-shared选项将.o文件转化为动态库,在linux中动态库被称为共享目标文件,后缀名为.so,而在windows中,动态库被称为动态链接库,后缀名为.dll
动态库使用实例
创建头文件hellow.h,c文件hellow.c,main.c将头文件放在上一级目录的includes目录中,同时创建libs目录,文件内容与静态库使用的文件相同
- 将hellow.c文件编译为.o文件
gcc -I../includes -fPIC -c hellow.c -o hellow.o
- 将.o文件编译为动态库文件
gcc -shared hellow.o -o ../libs/libhellow.so
- 链接main函数程序
gcc -I../includes -c main.c -o main.o
gcc main.o -L../libs -lhellow -o main
- 运行
[root@izhqmn61154vmrz libTest]# ./main
hellow you
在linux中,需要将自定义的lib目录导入变量LD_LIBRARY_PATH中,所以在创建libs文件夹后,需要执行
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/libs
后才能运行,否则会显示找不到动态库