C中静态库和动态库的使用
来源:互联网 发布:html 获取js定义的值 编辑:程序博客网 时间:2024/05/18 12:42
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.ohow.o:how.c gcc -c how.c -o how.olibgreet.a:hellow.o how.o ar -rcs libgreet.a hellow.o how.orun:main.c libgreet.a gcc main.c -L. -lgreet -o run
- 运行make run
[root@izhqmn61154vmrz libTest]# make rungcc -c hellow.c -o hellow.ogcc -c how.c -o how.oar -rcs libgreet.a hellow.o how.ogcc main.c -L. -lgreet -o run
- 运行run
[root@izhqmn61154vmrz libTest]# ./runhellow worldhow 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.ogcc main.o -L../libs -lhellow -o main
- 运行
[root@izhqmn61154vmrz libTest]# ./mainhellow you
在linux中,需要将自定义的lib目录导入变量LD_LIBRARY_PATH中,所以在创建libs文件夹后,需要执行
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/libs
后才能运行,否则会显示找不到动态库
阅读全文
0 0
- C中静态库和动态库的使用
- C语言中动态库/静态库的创建和使用
- Linux C 静态库和动态库的使用
- ios中静态库和动态库的使用
- 静态库和动态库的使用
- 静态库和动态库的使用
- 静态、共享和动态库的使用
- 静态、共享和动态库的使用
- C语言中静态库和动态库
- c语言------静态库和动态库的创建和使用
- c语言中静态库动态库的创建与使用
- linux c中静态库的使用
- C语言中静态库的使用
- C/C++中生成动态库和静态库的方法
- 在Linux中生成C/C++动态库和静态库的方法
- linux中c语言编程环境下的动态库和静态库
- C++windows内核编程笔记day11 win32静态库和动态库的使用
- linux c/c++ 动态库和静态库的生成与使用
- java-根据生日计算周岁
- Java多线程系列--“基础篇”07之 线程休眠
- Linux文件系统详解
- spring boot MySQL保存emoji表情
- Spring MVC详解
- C中静态库和动态库的使用
- Java容器类框架概述
- 子页面保存后刷新父页面
- bzoj 4556 字符串
- Spring MVC的Post请求参数中文乱码解决方法
- Comparison of Two Commonly Used Network Cables: Cat5e vs. Cat6
- 2017年最受欢迎的10个编程挑战网站
- react知识点学习(一)——定义CSS样式
- Node.js异常处理