C语言的动态函数库和静态函数库的生成和使用(linux环境下)

软件开发往往是一个十分庞大的工程.需要消耗大量的脑力.借助别人已经开发好的库,往往能提高效率,下面将介绍如何开发和使用共享的库文件.使用别人已经开发好的库,就像是我们想要建造一辆汽车十分困难,但是如果汽车的各大部件都已经存在并且可以获得,我们要做的工作就是组装,组装过程一定比设计这些部件要轻松.

函数库分为两种静态(static)函数库和动态(shared)函数库.两者都是函数的集合.区别:在编译的时候会把静态函数库的内容加到目标程序中,目标程序具有函数库的代码;而动态函数库是在执行的时候才把函数库中的函数加到目标中,目标程序中并没有函数库的代码.

Linux下面的库文件

动态: xxxx.so

静态: xxxx.a

Windows下面的库文件

动态: xxxx.dll

静态: xxxx.lib

常见C语言的库

Libpng

Libjpeg

Libmysql等

1.使用gcc编译一个动态库文件和使用一个动态库

Gcc -shared 源文件 -o 目标文件

其中-shared表示编译的结果是一个动态库文件,目标文件常常命名为libxxx.so.

例如,建立一个文件test.c和test.h的文件.

Test.c:

#include <stdio.h>

int print()

{

printf("hello this is lib");

}

Test.h

int print();

使用gcc -shared test.c -o libtest.so  (编译的结果最好使用lib开头,调用的时候可以省略)

生成了文件libtest.so的动态函数库(-shared表示生成动态函数库,-o表示生成的目标文件).

写一个程序(在call.c)用来调用这个函数库中的print()

#include "libtest.h"

int main()

{

print();

return 0;

}

编译的时候命令

gcc call.c -ltest -L. -o c

其中-lxx表示调用动态函数库,libtest.so,如果库文件的格式不是libxx.so,也可以使用-l xxx.so

-L. 表示这个函数库在当前文件夹下面

如果把libtest.so复制到/usr/lib或者/usr/local/lib下面,可以使用命令gcc call.c -ltest -o c不需要使用-L.参数.

如果直接运行./c会出现错误

#./c
: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory

原因:虽然已经把函数库放到系统库目录或者告知函数库在当前,但是系统会自动去/etc/ld.so.cache中去查找已经记录的函数库,并不是去文件夹下搜索.所以想要使用函数库,还需要使用命令ldconfig去搜索函数库添加到系统ld.so.cache中.

如果在当前的路径下,可以把当前路径添加到/etc/ld.so.conf中,然后运行ldconfig,就可以把当前的文件添加到ld.so.ccache中.

也可以修改临时的系统库变量LD_LIBRARY_PATH.在终端中使用命令

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../

(shell命令,可以使用echo $LD_LIBRARY_PATH来查看变量,关闭终端在打开就需要重新配置了)

之后,就可以运行了.

#./c

#hello this is lib

ldconfig是动态链接库管理命令.如果想详细了解,可以去仔细查看ldconfig的命令的相关细节.

还有一个命令ldd,他是查看程序需要什么样的动态库.

#ldd c

linux-gate.so.1 =>  (0xb77bd000)

libtest.so => not found

libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75fc000)

/lib/ld-linux.so.2 (0xb77c0000)

2.编译成静态库文件并使用

我们使用上面用到的例子libtest.c和libtest.h,call.c.

首先把libtest.c编译成静态的函数库.

Gcc -c libtest.c

把libtest.c编译成libtest.o,和不加-c的区别是,-c不进行链接

ar crv libtest.a libtest.o

Ar是把文件生成静态库.详细参考man ar

编译目标程序

Gcc call.c libtest.a -o c

然后就可以使用./c运行了.

因为静态库在编译的时候就加入了程序中,所以目标编译之后,就不需要xxx.a文件了.

虽然,相比之下静态库比较简单,但是采用静态库的代码往往很大.

原文地址:https://www.cnblogs.com/qiny1012/p/8910272.html

时间: 2024-12-09 03:56:57

C语言的动态函数库和静态函数库的生成和使用(linux环境下)的相关文章

Linux中的动态函数库和静态函数库的比较

库函数既提高了代码的利用率,又屏蔽了函数内部实现的细节,给不同开发者提供了统一的接口.从实现来看,库函数可以分为动态函数库和静态函数库.同一组函数,可以根据需要封装成静态库和动态库.那么生成静态库和动态库有什么区别?静态库和动态库对函数的实现上各有些什么要求?两者对内存各有什么影响呢?下面就带着这些问题一起开探讨. 静态库和动态库生成方式的区别为了简化,下面以一个只有一个函数的库的实现来说明.库函数的代码demo.c如下:/************************************

针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案

基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调试,从而获得程序运行状态下的信息( 关闭 ALSR 机制 ),基础的 gdb 操作可参见笔者的文章Linux下编辑.编译.调试命令总结--gcc和gdb描述.使用 gdb 可以方便的获取程序动态运行状态下的信息,但通过 gdb 动态调试获取的诸如缓冲区的起始地址等信息可能与程序实际运行时的信息并不相

每天一点GO语言——Linux环境下安装Go语言环境以及编写Go语言程序初体验

每天一点GO语言--Linux环境下安装Go语言环境以及编写Go语言程序初体验 一.安装Go语言环境 [[email protected] opt]# yum -y install wget git [[email protected] opt]# wget -c https://studygolang.com/dl/golang/go1.10.3.linux-amd64.tar.gz [[email protected] opt]# tar -zxvf go1.10.3.linux-amd64

Linux环境下非root用户安装Python及相关库

以前在使用python的时候,都是使用root用户安装好的全局python,现在,因为root用户安装的Python版本太低,同时自己没有root权限去对全局Python升级,所以要在非root用户下安装自己指定的Python.因此,就重新整理了一份如何在Linux环境下使用非root用户安装python及其相关的库,以备不时之需. 安装python python版本库https://www.python.org/ftp/python/,此处我选择2.7.5版本的,在安装python的时候,使用

Linux 环境下 gcc 链接库 编译、链接(概览) 以及 自动化工具Makefile的编写

个人博客首页(点击查看详情) -- https://blog.51cto.com/11495268 1.简介    程序编译一般需要经预处理.编译.汇编和链接,在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为 "库" 文件,本文 主要 描述 Linux 平台下 库文件的 创建 和 链接 相关操作(既然都看 这么底层的内容了,相信 也有一定的基础,所以本文 对相关命令 也不会进行详细解释)    备注:    linux平台下,静态链接库是以 .a 的后缀文件,动态链接库是以

Linux环境下的Python配置,必备库的安装配置

1.默认Python安装情况 一般情况,Linux会预装Python的,版本较低,比如Ubuntu15的系统一般预装的是Python2.7.10. 使用命令:which python可以查看当前的python的安装路径: 打开对应路径就可以看到: 如果没有明确必须要使用Python3的版本,可以直接使用2.7.10的版本. 明确需要使用Python3版本,再进行更改. 这里需要说明一点:上图中存在有python,python2,python3,说明安装了2和3的版本, 2.更改安装Python3

Linux环境下使用gcc编译,gdb反汇编C语言程序

使用虚拟机 VMware Workstation 10 Linux环境:Ubuntu 14.04 LTS Server amd64 我把过程截图如下. 首先是hello world程序: 备注: gcc -o 参数,指定生成程序文件名. gdb下,disas命令对应英文为disassembler,反汇编. 这里没有执行程序.如果想执行,会出现: [email protected]:~$./helloworld Hello World! [email protected]:~$ 当然,前面要加 .

Linux环境下MySQL基础命令----查看、创建、删除库和表

案例二,查看数据库 MySQL是一套数据库管理系统,支持运行多个库,每个库相当于一个容器,存放着许多表.数据就存在这些表中,所以查看.创建.删除库和表,在工作中必不可少. 一,查看 1,查看当前服务器中有哪些库 使用命令:SHOW DATABASES;          //查看库信息 2,查看当前使用的库中有哪些表 使用命令: USE mysql;                                 //使用USE命令切换到名为mysql的表中 使用命令: SHOW TABLES;

Linux环境下救援模式初探-修复误删除的库文件或者命令

说是警醒警醒,不过一不小心还是将重要库或者指令误删除,如果误删除,应该如何恢复呢? 一.误删库libc.so.6 以Centos7为例,先进入救援模式,开机界面按esc,选到光盘启动,CD-ROM Drive 之后选择troubleshooting 然后进入Rescue模式 点回车后点1,进入如下界面 回车后输入cp /lib64/libc.so.6 /mnt/sysimage/lib64 此时/lib64是救援模式的目录,/mnt/sysimage/lib64才是系统中真正的/lib64目录