转自:https://www.cnblogs.com/CoderTian/p/5902154.html 

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语言动态库和静态库的使用及实践的更多相关文章

  1. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  2. Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

    Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://b ...

  3. Linux系统中“动态库”和“静态库”那点事儿【转】

    转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻. ...

  4. Linux系统中“动态库”和“静态库”那点事儿

    摘自http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在 ...

  5. gcc编译工具生成动态库和静态库之一----介绍

     1.库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. ...

  6. Android:JNI与NDK(二)交叉编译与动态库,静态库

    欢迎关注公众号,第一时间获取最新文章: 本篇目录 一.前言 本篇主要以window开发环境为背景介绍一下NDK开发中需要掌握的交叉编译等基础知识,选window系统主要是照顾大多数读者,mac ,li ...

  7. GCC 指令详解及动态库、静态库的使用

    GCC 指令详解及动态库.静态库的使用 一.GCC 1.1 GCC 介绍 GCC 是 Linux 下的编译工具集,是「GNU Compiler Collection」的缩写,包含 gcc.g++ 等编 ...

  8. 【转】iOS动态库和静态库的简要介绍

    静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人 ...

  9. Linux中的动态库和静态库(.a/.la/.so/.o)

    Linux中的动态库和静态库(.a/.la/.so/.o) Linux中的动态库和静态库(.a/.la/.so/.o) C/C++程序编译的过程 .o文件(目标文件) 创建atoi.o 使用atoi. ...

  10. libjpeg 交叉编译动态库和静态库

    1.下载libjpeg库,解压之     得到了jpeg6b和libtool-2.2.4两个文件夹. 2.编译安装libtool工具.   这是配置libtool,这里需要注意:configure 参 ...

随机推荐

  1. qq第三方登录网站接口

    网站如何实现QQ登录功能 | 浏览:11029 | 更新:2013-12-05 10:09 1 2 3 4 5 6 7 分步阅读 一键约师傅 百度师傅为你的电脑系统,选一个靠谱师傅! 如果想让网站实现 ...

  2. Python面试题之Python中type和object的关系

    知乎上看到的提问: 两个是互为实例的关系,但不是互为子类的关系,只有type是object的子类,反之则不成立. 大牛说两者是蛋生鸡鸡生蛋的关系,但我还是不明白,有懂的麻烦解释一下, 希望不要给出外文 ...

  3. 前端js实现字符串/图片/excel文件下载

    在web开发中,如果你想让用户下载或者导出一个文件,应该怎么做呢?传统的做法是在后端存储或者即时生成一个文件来提供下载功能,这样的优势是可以做权限控制.数据二次处理,但缺点是需要额外发起请求.增大服务 ...

  4. [BZOJ1117]救火站gas

    Description 给你一棵树,现在要建立一些消防站,有以下要求: 1. 消防站要建立在节点上,每个节点可能建立不只一个消防站. 2. 每个节点应该被一个消防站管理,这个消防站不一定建立在该节点上 ...

  5. 异步:asyncio和aiohttp的一些应用(2)

    转自:原文链接:http://www.cnblogs.com/ssyfj/p/9222342.html 1.aiohttp的简单使用(配合asyncio模块) import asyncio,aioht ...

  6. spring 及 spring boot 资源文件配置

    Spring配置文件引入xml文件: <import resource=" " />标签使用总结 https://www.cnblogs.com/javahr/p/83 ...

  7. tp5搭建1

    1.首先在wamp环境根目录下创建文件夹resource. 2.利用composer下载tp5框架 怎么利用composer下载tp5框架 根据tp5完全开发手册,composer下载你的tp5框架 ...

  8. tp5.1升级

    # php think version v5.1.23 # composer update Loading composer repositories with package information ...

  9. 【Bitset】重识

    ---------------------------------------------------------------------------- 一题题目: 一题题解: 这个题目哪来入门再好不 ...

  10. 15 个有趣的 JS 和 CSS 库

    开发者们,一起来看看有木有你需要的前端库. 1. DisplayJS DisplayJS 是一个帮助你渲染 DOM 的简易框架.使用它,你可以更容易地将 JS 变量遍历到特定的 HTML 元素中,类似 ...