Linux库的创建和使用

Linux库的概念

库是一种软件组建技术,里面封装了数据和函数,提供给用户程序调用。使用库可以使程序模块化,提高编译速度,实现代码重用,易于升级。Windows系统提供了大量静态链接库(.lib)和动态链接库(.dll)文件。在Linux中,库文件放在/usr/lib或/lib目录下,Linux库文件名由前缀lib,库名以及后缀三部分组成,动态库以.so作为后缀,静态库以.a作为后缀。


静态库的特点

静态库的代码在编译时就拷贝到程序中,多个程序同时引用一个静态库函数时,内存中将会有调用函数的多个副本。静态库节省编译时间,但是导致代码量膨胀。优点是编译后的执行程序不需要外部函数库支持,但是如果静态函数库改变了,程序需要重新编译。

静态库的创建和使用

步骤:

  1. 在一个头文件中声明静态库所导出的函数。
  2. 在一个源文件中实现静态库所导出的函数。
  3. 编译源文件,生成可执行代码。
  4. 将可执行代码所在的目标文件加入到某个静态库中,并将静态库拷贝到系统默认存放库文件的目录下。(如果不拷贝则需要用命令行选项指定库文件所在目录)

    实例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

/* mylib.h */

#ifndef _MYLIB_H

#define _MYLIB_H

void welcome();

void print_string(const char *str);

#endif

/* mylib.c */

#include "mylib.h"

#include <stdio.h>

void welcome()

{

printf("Welcome to libmylib\n");

}

void print_string(const char *str)

{

if (str != NULL)

printf("%s\n", str);

}

编译mylib.c生成目标文件:

gcc -o mylib.o -c mylib.c

将目标文件加入到静态库中,静态库为libmylib.a

ar rcs libmylib.a mylib.o

rcs命令行是选项,含义请参考man手册

将静态库拷贝到Linux的库目录/usr/lib或/lib下:

cp libmylib.a /usr/lib/libmylib.a

1

2

3

4

5

6

7

8

9
/* test.c */

#include "mylib.h"

#include <stdio.h>

int main(void)

{

welcome();

print_string("It‘s successful");

return 0;

}

编译并且执行:

gcc -o test test.c -lmylib

-l为选项,mylib是库名,省略前后缀

./test

如果前面没有拷贝到Linux的库目录,需要指定静态库文件的路径

gcc -o test test.c -L. -lmylib

-L.表示库文件在当前路径。

更多ar命令请参考man ar手册。


动态库的特点

动态库在程序开始运行后调用库函数时才被载入,被调函数在内存中只有一个副本,且可以在程序运行期间释放动态库所占的内存。目前Linux中使用动态库居多,因为升级方便。

动态库的创建和使用

把mylib.c创建成动态库的命令:

gcc -fPIC -o mylib.o -c mylib.c

gcc -shared -o mylib.so mylib.o

或者

gcc -fPIC -shared -o mylib.so mylib.c

使用动态库:

gcc -o test test.c ./mylib.so

./test

另一种方法是通过调用系统函数使用动态链接库,具体参考

void* dlopen(const char *filename, int flag)系列函数。


参考

《Linux C编程实战》,添加部分内容,修改了部分代码。

时间: 2024-11-08 22:15:58

Linux库的创建和使用的相关文章

linux上静态库的创建和使用

静态库的概念: 我们知道程序编译一般需经预处理.编译.汇编和链接几个步骤.在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中.这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝. 静态库的创建: 比如我有如下一些操作数组的函数需要将他们做成静态库,方便在使用时不需要重复定义,array.h头文件如下: 1 #ifndef ARRAY_H_

redhat linux 5上创建本地yum源

1.挂载光驱 [[email protected] ~]#mkdir -p /mnt/cdrom [[email protected] ~]#mount /dev/cdrom /mnt/cdrom 2.将redhat光盘内容复制至本地硬盘 因为创建yum源的目录,必须是可以写入的的目录,所以需要将光盘中的文件全部复制到本地目录,如果在/mnt/cdrom光驱挂载目录执行创建yum源,会报"Directory /mnt/cdrom must be writable."错误 [[email

QT共享库的创建与调用(初级)

背景: 最近在做的一个项目其中一部分既是实现PC与下位机的USB通信.windows平台下已经完成,现需移植到linux平台下. 在linux系统中,通过一段时间的工作,设备已被配置成hid类(后续再详述),并以hidraw类设备节点存在于系统中"/dev/"下.上位机则成功在console中通过调用HIDAPI库来写入.读取hidraw设备节点信息(后续再详述),而进一步的图形界面则需由QT来完成. hidraw设备介绍: https://www.kernel.org/doc/Doc

linux库文件编写入门(笔记)

linux库文件的编写 作者: laomai地址: http://blog.csdn.net/laomai 本文主要参考了如下资料⑴hcj写的"Linux静态/动态链接库的创建和使用"地址 http://fanqiang.chinaunix.net/system/linux/2006-05-08/4126.shtml⑵雨亦奇的文章"LINUX动态链接库高级应用"地址http://www.ccw.com.cn/htm/center/prog/02_3_13_3_2.a

Git - 远程库的创建与认证

前些日子因为某些原因,需要在windows上创建一个remote仓库. 由于实在是太麻烦而且时间紧急,就直接用了gitstack. 发现这个东西居然需要付费,未认证时只能创建两个用户. 其实对我而言足够了,但不是长久之计. 好在后来又有了一台机器装了linux,这就回到正轨. 因为我也是一直使用别人弄的remote仓库,这次便把创建过程记录下来. git init是第一步,我经常很理所当然地进行如下操作: [[email protected] ~]# mkdir myProject [[emai

Github实例教程-创建库、创建主页

以README文件为实例,详细介绍github的使用过程 请先下载git,然后配置以下内容: ( 我的系统是debian,其他版本的UNIX/Linux有差别),windows的暂时不清楚. (一) 1.先下载git $ apt-get install git-core 2.创建git用户名(Username),首先你要告诉git你的名字,这样它才能正确的给你提交的的东西打上标签. (First you need to tell git your name, so that it can pro

NET Core MVC 在linux上的创建及发布

NET Core MVC 在linux上的创建及发布 前言 ASP.NET core转眼都发布半月多了,社区最近也是非常活跃,虽然最近从事python工作,但也一直对.NET念念不忘,看过了园区大神们搭建的Asp.net core项目之后,自己也是跃跃欲试,准备搞一下ASP.NET Core mvc的创建和部署,于是便有了这篇文章,希望能够帮助到你. 环境准备 这是我的开发环境,使用的nginx是nginx 1.6.3 直接yum install,然后需要安装dotnet环境,可以参照官网教程h

windows azure虚拟机创建——快速创建,库模板创建

在 Windows Azure 上创建新虚拟机是一件非常轻松的事情.只需使用浏览器访问 Windows Azure 管理门户,选择左侧的"虚拟机"选项卡,然后单击底部命令栏中的"新 建"按钮. 这里我们有两种方式可以选择:快速创建创建虚拟机或者从库中选择模板来创建虚拟机,这篇博文将对两种方式都进行下介绍 首先,我们选择"快速创建",输入相应的信息并选择系统映像和CPU及内存规格,这里需要注意的是密码一定要符合复杂性要求:8个字符.数字.大小写字母

Linux 库文件详解

转自: http://www.cppblog.com/deane/articles/165216.html http://blog.sciencenet.cn/blog-1225851-904348.html http://www.pchou.info/linux/2016/07/17/linux-libraries.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于wind