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编程实战》,加入部分内容,改动了部分代码。

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

  1. Linux C C语言库的创建和调用

    C语言库的创建和调用 简介: 假如,你有一个庞大的工程,代码量达到数百兆甚至是数G,你经常会遇到好多重复或常用的地方.每次使用到这些地方时如果都重新写一份基本相同的代码,这当然可以,不过这样会大大地降 ...

  2. iOS - 静态库的创建与使用

    在日常项目开发中,不论是为了两个公司项目上的业务交流还是为了减少项目的编译时间,有的时候我们会把项目中的私密内容打包成静态库,或者是把项目中变动较少一部分打包成静态库以便提高编译效率,那么下面我们就来 ...

  3. QT共享库的创建与调用(初级)(附:UI界面不能被改变的其中一个原因)

    背景: 最近在做的一个项目其中一部分既是实现PC与下位机的USB通信.windows平台下已经完成,现需移植到linux平台下. 在linux系统中,通过一段时间的工作,设备已被配置成hid类(后续再 ...

  4. linux库

     将库函数打包成一个单元使之能够在运行时被多个进程共享的技术,这种技术能够节省磁盘空间和RAM. 一. 静态库:1.概念:    静态库就是一些目标文件的集合,以.a结尾.静态库在程序链接的时候使用, ...

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

    linux库文件的编写 作者: laomai地址: http://blog.csdn.net/laomai 本文主要参考了如下资料⑴hcj写的"Linux静态/动态链接库的创建和使用&quo ...

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

    NET Core MVC 在linux上的创建及发布 前言 ASP.NET core转眼都发布半月多了,社区最近也是非常活跃,虽然最近从事python工作,但也一直对.NET念念不忘,看过了园区大神们 ...

  7. Linux 库文件详解

    转自: http://www.cppblog.com/deane/articles/165216.html http://blog.sciencenet.cn/blog-1225851-904348. ...

  8. Windows下静态库与动态库的创建与使用

    Windows下静态库与动态库的创建与使用 学习内容:本博客介绍了Windows下使用Visual C++ 6.0制作与使用静态库与动态库的方法. --------CONTENTS-------- 一 ...

  9. Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明

    本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法: 1.添加动态库(直接添加动态库文件.dll,非子项目) 通过qtcreator创建动态库的方法就不在此 ...

随机推荐

  1. Python如何import文件夹下的文件

    Python的import包含文件功能就跟PHP的include类似,但更确切的说应该更像是PHP中的require,因为Python里的import只要目标不存在就报错程序无法往下执行.要包含目录里 ...

  2. 在IIS上部署基于django WEB框架的python网站应用

    django是一款基于python语言的WEB开源框架,本文给出了如何将基于django写的python网站部署到window的IIS上. 笔者的运行环境: Window xp sp3 IIS 5.1 ...

  3. 使用 soapUI 测试 REST 服务

    REST 服务介绍 REST(Representational State Transfer)是 Roy Fielding 博士在 2000 年提出的一种新的软件架构风格,它以资源(resource) ...

  4. 【Go入门教程5】流程(if、goto、for、switch)和函数(多个返回值、变参、传值与传指针、defer、函数作为值/类型、Panic和Recover、main函数和init函数、import)

    这小节我们要介绍Go里面的流程控制以及函数操作. 流程控制 流程控制在编程语言中是最伟大的发明了,因为有了它,你可以通过很简单的流程描述来表达很复杂的逻辑.Go中流程控制分三大类:条件判断,循环控制和 ...

  5. 使用jQuery异步传递含复杂属性及集合属性的Model到控制器方法

    Student类有集合属性Courses,如何把Student连同集合属性Courses传递给控制器方法?     public class Student     {         public ...

  6. Weblogic下启用Gzip压缩

    一.首先,去http://sourceforge.net/projects/filterlib网站下载tk-filters-1.0.1.zip. 二.解压这个tk-filters-1.0.1.zip压 ...

  7. 使用线程安全的 MSWeakTimer ,它不会对目标进行retain操作,避免循环引用

    MSWeakTimer 简易翻译:该timer没有runloop概念,线程安全,没有循环引用现象. https://github.com/mindsnacks/MSWeakTimer Descript ...

  8. 数据库实例: STOREBOOK > 表空间 > 编辑 表空间: TEMP

    ylbtech-Oracle:数据库实例: STOREBOOK  >  表空间  >  编辑 表空间: TEMP 表空间  >  编辑 表空间: TEMP 1. 一般信息返回顶部 1 ...

  9. [Linux]在终端启动程序关闭终端不退出的方法

    一般情况下关闭终端时,那么在这个终端中启动的后台程序也会终止,要使终端关闭后,后台程序保持执行,使用这个指令: nohup 命令 & 如:nohup test.sh & 回车,然后提示 ...

  10. STL队列 之FIFO队列(queue)、优先队列(priority_queue)、双端队列(deque)

    1.FIFO队列   std::queue就是普通意思上的FIFO队列在STL中的模版. 1.1主要的方法有: (1)T front():访问队列的对头元素,并不删除对头元素 (2)T back(): ...