C中静态库和动态库的使用

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文件

相关推荐
顾安r3 小时前
11.8 脚本网页 星际逃生
c语言·前端·javascript·flask
LaoZhangGong1234 小时前
STM32 F103外部晶振8MHz改为12MHz,如何配置?
c语言·stm32·单片机·嵌入式硬件·晶振
独隅4 小时前
在 Lua 中,你可以使用 `os.date()` 函数轻松地将时间戳转换为格式化的时间字符串
开发语言·lua
思麟呀5 小时前
Linux的基础IO流
linux·运维·服务器·开发语言·c++
星释5 小时前
Rust 练习册 :Pythagorean Triplet与数学算法
开发语言·算法·rust
星释5 小时前
Rust 练习册 :Nth Prime与素数算法
开发语言·算法·rust
lkbhua莱克瓦245 小时前
Java基础——集合进阶3
java·开发语言·笔记
多喝开水少熬夜6 小时前
Trie树相关算法题java实现
java·开发语言·算法
QT 小鲜肉6 小时前
【QT/C++】Qt定时器QTimer类的实现方法详解(超详细)
开发语言·数据库·c++·笔记·qt·学习
lsx2024066 小时前
MySQL WHERE 子句详解
开发语言