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 参 ...
随机推荐
- tab标签 插件 by 腾讯 jianminlu
/** * @version 0.1 * @author jianminlu * @update 2013-06-19 15:23 */ (function ($) { /** * @name tab ...
- Send2MyKindle使用说明文档
软件下载地址为:Send2MyKindle 功能简介 该软件主要功能为在Windows下将Kindle电子书发送到亚马逊中国网站注册的Kindle账户.整个软件界面如下图所示: 使用步骤 使用前的准备 ...
- linux安全第一周总结——20135227黄晓妍
实验部分: 我将源代码做了修改,将其中一个数字修改为我学号27 2.在实验楼环境下将其保存为text.c并将其编译,得到text.s 3.将.开头的多余的语句删去了之后,我得到了32位环境的汇编代码 ...
- STC51几种简单的延时函数
STC51几种简单的延时函数 ,* 延时子程序 * * * ********************************************************************** ...
- Jquery 复制功能
使用clipboardjs插件实现鼠标点击复制功能: 官网:https://clipboardjs.com/ 使用示例: 1.引入 <script type="text/javascr ...
- tomcat优化方案(转)
1.内存设置(VM参数调优) (1).Windows环境下,是tomcat解压版(执行startup.bat启动tomcat) ,解决办法: 修改“%TOMCAT_HOME%\bin\catalina ...
- erwin逆向工程,logical模型列名修改为中文
逆向工程,应该选择physical template,这样拷贝到logical/physical 模型中,才可以将logical模型的列名修改为中文.
- 【分类】AlexNet论文总结
目录 0. 论文链接 1. 概述 2. 对数据集的处理 3. 网络模型 3.1 ReLU Nonlinearity 3.2 Training on multiple GPUs 3.3 Local Re ...
- Linux基础知识点
1.目录结构 bin 存放二进制可执行文件(ls,cat,mkdir等) boot 存放用于系统引导时使用的各种文件 dev 用于存放设备文件 etc 存放系统配置文件 home 存放所有用户文件的根 ...
- codeforce diversity
2017-08-25 14:59:34 writer:pprp 题意如下:给你一个串字符,再给你一个数字,表示在字符串中的各不相同的字符个数, 问你最少需要改变几个字符达到要求,不能达到要求就输出im ...