静态库与动态库

简介:   函数库分为静态库和动态库两种   静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。 动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

 

函数库分为静态库和动态库两种

 

静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

 

示例代码:

 

头文件  hello.h  

 

#ifndef _HELLO_H
#define _HELLO_H
void hello(void);
#endif

 

源文件  hello.c

 

void hello(void)
{
    printf("hello world\n");
}


 源文件  main.c

#include stdio.h>

#include "hello.h"

int main()
{
    hello();
    return 0;
}

 

静态库的制作与使用

 

静态库实际上是o目标文件的一个归档,使用ar工具可以创建静态库。

#gcc –c hello.c

#ar cr libhello.a hello.o

 

使用静态库,运行时不依赖静态库

#gcc –o main main.c –L. –lhello  //生成可执行文件main

#./main   //hello world

#rm libhello.a –rf  //移除静态库

#./main   //hello world

 

动态库的制作与使用

   在制作动态库时,要制定-shared,并可通过-fPIC标志生成位置无关代码。

-shared
     Produce a shared object which can then be linked with othe objects to form an executable.  Not all systems support this
option.  For predictable results, you must also specify the same set of options that were used to generate code (`-fpic', `-fPIC', or model suboptions) when you specify this option.

 

# gcc -shared -fPIC -o libmyhello.so hello.o

# gcc -o hello main.c -L. -lmyhello

# ./hello

./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

 

因为程序默认在/lib, /usr/lib, LD_LIBRARY_PATH, /etc/ld.so.conf指定的路径查找库,所以可以将libhello.so移动到/lib//usr/lib下,或将当前目录加入到环境变量LD_LIBRARY_PATH,或加到配置文件/etc/ld.so.conf(需要运行ldconfig)。

链接动态库的程序在运行时需要库的存在,因其在运行时动态加载库,从而缩小了可执行文件的体积,节省了磁盘空间,而且动态库可被多个用户程序共享,节省更多的内存空间。

 

 

 


目录
相关文章
|
Web App开发 前端开发
chrome浏览器web打印需要了解的几个小技巧
当我们使用web打印相关的解决方案的时候,还有不少小坑值得注意下,同时需要了解几个小技巧提升在web打印上的友好度,以下整理一些常见的小技巧
chrome浏览器web打印需要了解的几个小技巧
|
运维 Java 程序员
一个合格的程序员,需要哪些必备技能?
对于一个Java开发来说,编程技能毋庸置疑是很重要的。 但是,除了基本的编程开发能力,其他方面的能力也是体现一个程序员的能力的很重要因素。 比如,问题排查能力、线上运维能力、项目管理能力、协调沟通能力等。 本文,主要来简单介绍一下,作为一个合格的Java开发,除了自身技术成长之外,还有哪些方面可以提升。 类开发技能 第一类,并不是纯coding技能,但是也和开发相关,我称之为类开发技能。 Linux系统 很多人的开发机器是windows,所以平时也基本都是图形化开发界面。但是,这并不意味着你就不需要基本的Linux技巧。 因为,你开发出来的应用可能部署在一台Linux机器上,很
861 0
An工具介绍之骨骼工具
An工具介绍之骨骼工具
2045 0
An工具介绍之骨骼工具
|
JSON 搜索推荐 前端开发
DingTalk「开发者说」- 酷应用开发之卡片开发和能力套件开放
本篇主要讲解钉钉酷应用中卡片的构造、接口和最佳实践,以及卡片未来的规划和能力套件开放。适用对象:产品经理和有技术背景的开发工程师。
DingTalk「开发者说」- 酷应用开发之卡片开发和能力套件开放
|
机器学习/深度学习 存储 JSON
6款Python可视化工具,总有一款适合你!
6款Python可视化工具,各有所长,适用于不同的场景,但是,它们都有一个共同点:强大且好用!下面就开始正文吧!
6款Python可视化工具,总有一款适合你!
|
存储 云计算
Gartner:阿里云排名全球第三,市场份额连续六年上涨
Gartner:阿里云排名全球第三,市场份额连续六年上涨
3185 0
|
安全 网络协议 网络安全
部署PKI和证书服务详解
部署PKI和证书服务详解
490 0
|
SQL 关系型数据库 Linux
信创迁移适配预研-达梦数据库DM8服务与客户端工具安装使用
信创迁移适配预研-达梦数据库DM8服务与客户端工具安装使用
864 0
信创迁移适配预研-达梦数据库DM8服务与客户端工具安装使用
|
机器学习/深度学习
MPNN:消息传递神经网络
MPNN:消息传递神经网络
917 0
MPNN:消息传递神经网络
|
存储 IDE Java
玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定(上)
玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定(上)
玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定(上)