C语言动态库和静态库的使用及实践
1.C语言中的链接器
(1)每个 C 语言源文件被编译后生成目标文件,这些目标文件最终要被链接在一起生成可执行文件。
(2)链接器的主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接。
2.静态链接
由链接器在链接时将库的内容直接加入到可执行程序中
①编译静态库源码:gcc –c lib.c –o lib.o
②生成静态库文件:ar –q lib.a lib.o //将 lib.o 与其他文件打包到 lib.a 中
③使用静态库编译:gcc main.c lib.a –o main.out
3.动态链接
可执行程序在运行时才动态加载库进行链接 ,库的内容不会进入可执行程序当中
①编译动态库源码:gcc –shared dlib.c –o dlib.so
②使用动态库编译:gcc main.c -ldl –o main.out
4.dlopen、dlsym、dlclose使用动态库
为了使程序方便扩展,具备通用性,可以采用插件形式。采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件。linux提供了加载和处理动态链接库的系统调用,非常方便。
①打开动态库:dlopen
②查找动态库中的函数并返回调用地址:dlsym
③关闭动态库:dlclose
dlib.c 库

char* name()
{
return "Dynamic Lib";
}
int add(int a, int b)
{
return a + b;
}

test.c

#include <stdio.h>
#include <dlfcn.h>
int main()
{
//打开(加载)动态库
void* pdlib = dlopen("./dlib.so", RTLD_LAZY);
char* (*pname)();
int (*padd)(int, int);
if( pdlib != NULL )
{
//查找函数地址
pname = dlsym(pdlib, "name");
padd = dlsym(pdlib, "add");
if( (pname != NULL) && (padd != NULL) )
{
printf("Name: %s\n", pname());
printf("Result: %d\n", padd(2, 3));
}
//关闭动态库
dlclose(pdlib);
}
else
{
printf("Cannot open lib ...\n");
}
return 0;
}

gcc -shared dlib.c -o dlib.so
gcc test.c -o test.o -ldl
参考资料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html
-----------自己使用的过程--------------------
动态库:
[root@cent634 src]# cat Makefile
all:
gcc -w -g -std=c99 -fPIC -shared -I../include/zookeeper -I../inlcude -L../lib/ -lzookeeper_mt -o ecox_rws_helper.so zookeeperhelper.c clusterinfohelper.c
gcc -o test main.c ecox_rws_helper.so
clean:
rm *.so test
[root@cent634 src]#
静态库:
[root@cent634 src]# cat Makefile_static
all:
gcc -g -std=c99 -I../include/zookeeper -o zookeeperhelper.o -c zookeeperhelper.c -I../include -L../lib -lzookeeper_mt
gcc -g -std=c99 -o clusterinfohelper.o -c clusterinfohelper.c -I../include
#这里无法将zookeeper_mt库合并到这个静态库中,因为那是动态库···,只能在连接代码时指定动态库
ar -q ecox_rws_helper.o zookeeperhelper.o clusterinfohelper.o
gcc main.c ecox_rws_helper.o -o test_static -L../lib -lzookeeper_mt clean:
rm *.o test_static
原始的:
[root@cent634 src]# cat Makefile_org
all:ecox_rws_helper ecox_rws_helper:zookeeperhelper.o main.o clusterinfohelper.o
gcc -g -L../lib -lzookeeper_mt -o $@ $^ zookeeperhelper.o:zookeeperhelper.c
gcc -g -std=c99 -I../include/zookeeper -o $@ -c $^
clusterinfohelper.o:clusterinfohelper.c
gcc -g -c -o $@ $^
main.o:main.c
gcc -g -c -o main.o main.c
.PHONY:clean clean:
rm *.o
C语言动态库和静态库的使用及实践的更多相关文章
- ios 开发中 动态库 与静态库的区别
使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...
- Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名
Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名 转载自:http://b ...
- Linux系统中“动态库”和“静态库”那点事儿【转】
转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻. ...
- Linux系统中“动态库”和“静态库”那点事儿
摘自http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在 ...
- gcc编译工具生成动态库和静态库之一----介绍
1.库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. ...
- Android:JNI与NDK(二)交叉编译与动态库,静态库
欢迎关注公众号,第一时间获取最新文章: 本篇目录 一.前言 本篇主要以window开发环境为背景介绍一下NDK开发中需要掌握的交叉编译等基础知识,选window系统主要是照顾大多数读者,mac ,li ...
- GCC 指令详解及动态库、静态库的使用
GCC 指令详解及动态库.静态库的使用 一.GCC 1.1 GCC 介绍 GCC 是 Linux 下的编译工具集,是「GNU Compiler Collection」的缩写,包含 gcc.g++ 等编 ...
- 【转】iOS动态库和静态库的简要介绍
静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人 ...
- Linux中的动态库和静态库(.a/.la/.so/.o)
Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...
- libjpeg 交叉编译动态库和静态库
1.下载libjpeg库,解压之 得到了jpeg6b和libtool-2.2.4两个文件夹. 2.编译安装libtool工具. 这是配置libtool,这里需要注意:configure 参 ...
随机推荐
- Django学习笔记之Models与ORM操作
一.ORM增加 from django.db import models class Publisher(models.Model): name = models.CharField(max_leng ...
- JAVA学习笔记之JAVA 对象引用以及赋值
关于对象与引用之间的一些基本概念. 初学Java时,在很长一段时间里,总觉得基本概念很模糊.后来才知道,在许多Java书中,把对象和对象的引用混为一谈.可是,如果我分不清对象与对象引用, 那实在没 ...
- 20145302张薇《Java程序设计》实验二报告
20145302张薇<Java程序设计>实验二:Java面向对象程序设计 使用TDD的方式设计实现复数类:Complex 测试代码 import org.junit.Test; publi ...
- DOS/BAT批处理if exist else 语句的几种用法
在DOS批处理命令中常常会通过if语句来进行判断来执行下面的命令, 那么批处理if语句怎么用呢,下面学无忧小编就来说说有关批处理if以及if exist else语句的相关内容.一.批处理if书写格式 ...
- 数据结构实习 - Problem N 树的括号表示法
writer:pprp date:20171103 题目描述 先将根结点放入一对圆括号中,然后把它的子树按由左而右的顺序放入括号中,而对子树也采用同样方法处理:同层子树与它的根结点用圆括号括起来,同层 ...
- Jenkins-Kubernetes-docker-自动发布
使用的是Jenkins pipeline: 这里只是做了更新,没有创建,没有借助helm等工具,先用着,以后再研究. pipeline { agent any stages { stage(" ...
- iOS学习-字符串的删除替换
字符串的常用处理,删除,替换.记录一下,方便查找. -------------------------------------------------------------------------- ...
- [spring]Bean注入——使用注解代替xml配置
使用注解编程,主要是为了替代xml文件,使开发更加快速. 一.使用注解前提: <?xml version="1.0" encoding="UTF-8"?& ...
- spring mvc: Hibernate验证器(字段不能为空,在1-150自己)
spring mvc: Hibernate验证器(字段不能为空,在1-150自己) 准备: 下载Hibernate Validator库 - Hibernate Validator.解压缩hibern ...
- Python面向过程和面向对象基础
总结一下: 面向过程编程:根据业务逻辑从上到下的写代码-----就是一个project写到底,重复利用性比较差 函数式:将某些特定功能代码封装到函数中------方便日后调用 面向对象:对函数进行分类 ...