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

devtools/2025/2/7 6:25:46/
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文件

http://www.ppmy.cn/devtools/156739.html

相关文章

Oracle 创建JOB调用存储过程自动归档删除LOG类表

-- 查询定时任务的语句: SELECT * FROM user_scheduler_jobs; -- 查询所有用户的定时任务: SELECT * FROM ALL_SCHEDULER_JOBS; -- 注意定时任务的OWNER -- 查询定时任务执行的LOG表: SELECT * FROM user_scheduler_job_log WHERE job_name = JOB_PROC_QUALITY_STATISTICS_…

漏洞管理:筑牢网络安全防线的关键环节

在当今数字化时代&#xff0c;网络漏洞如同隐藏在系统深处的“地雷”&#xff0c;一旦被触发&#xff0c;可能引发数据泄露、系统瘫痪等一系列严重后果。因此&#xff0c;漏洞管理成为保障网络安全的重中之重。九河云来和大家聊一聊漏洞管理的相关知识把。 漏洞管理是一个系统…

人工智能丨利用人工智能 AIGC 实现自媒体变现

在数字化时代&#xff0c;自媒体已经成为了一个巨大的财富池。无论是视频创作者、博主&#xff0c;还是文字内容制作者&#xff0c;获取收益的可能性都在不断增大。然而&#xff0c;面对信息过载和竞争加剧&#xff0c;许多自媒体人的收入始终处于低迷状态。这个时候&#xff0…

【STM32】HAL库USB虚拟U盘MSC配置及采用自带的Flash作为文件系统

【STM32】HAL库USB虚拟U盘MSC实现配置及采用自带的Flash作为文件系统 本文将自带的Flash作为文件系统 通过配置USB的MSC功能实现虚拟U盘 没有单独建立FATFS文件系统 仅仅是配置USB和Flash读写而已 当然 这里也可以用外部Flash等等 也可以配置文件系统来进行套壳 但总体而言不如…

利用腾讯云cloud studio云端免费部署deepseek-R1

1. cloud studio 1.1 cloud studio介绍 Cloud Studio&#xff08;云端 IDE&#xff09;是基于浏览器的集成式开发环境&#xff0c;为开发者提供了一个稳定的云端工作站。支持CPU与GPU的访问。用户在使用 Cloud Studio 时无需安装&#xff0c;随时随地打开浏览器即可使用。Clo…

【Linux】Linux经典面试题

文章目录 1. Linux文件系统1.1 什么是inode&#xff1f;1.2 硬链接和软链接的区别1.3 文件权限和所有权 2. Linux进程管理2.1 进程和线程的区别2.2 进程间通信&#xff08;IPC&#xff09;2.3 守护进程&#xff08;Daemon&#xff09; 3. Linux内存管理3.1 虚拟内存和物理内存3…

c++ linux recv的概念和使用案例(服务端和客户端都有)

recv函数是用于接收数据的socket函数&#xff0c;在C Linux环境中扮演着关键角色。其原型如下&#xff1a; ssize_t recv(int sockfd, void *buf, size_t len, int flags);参数说明&#xff1a; sockfd&#xff1a; socket描述符&#xff0c;标识要接收数据的socket。buf&…

ubuntu下迁移docker文件夹

在 Ubuntu 系统中迁移 Docker 文件夹&#xff08;如 Docker 数据存储文件夹 /var/lib/docker&#xff09;到另一个磁盘或目录&#xff0c;通常是为了释放系统盘空间。以下是迁移过程的详细步骤&#xff1a; 1. 停止 Docker 服务 在进行迁移之前&#xff0c;必须停止 Docker 服…