原文转自 :http://www.cnblogs.com/ljtknowns/p/5647793.html

文件目录结构如下

1 dynamiclibapp.c
2 Makefile
3 comm/inc/apue.h
4 comm/errorhandle.c
5 dynamiclib/Makefile
6 dynamiclib/dynamiclib_add.c
7 dynamiclib/dynamiclib_mul.c
8 dynamiclib/inc/dynamiclibs.h
9 dynamiclib/libs/

1. dynamiclib目录

dynamiclib/inc/dynamiclibs.h 文件内容如下:

1 #ifndef __dynamic_libs_h__
2 #define __dynamic_libs_h__
3
4 #include "apue.h"
5 int dynamic_lib_func_add(int i1, int i2);
6 int dynamic_lib_func_mul(int i1, int i2);
7
8 #endif

dynamiclib/dynamiclib_add.c 文件内容如下:

1 #include "dynamiclibs.h"
2
3 int dynamic_lib_func_add(int i1, int i2)
4 {
5     int iret = i1 + i2;
6     printf("... in .so func, %d add %d,return %d\n", i1, i2, iret);
7     return iret;
8 }

dynamiclib/dynamiclib_mul.c 文件内容如下:

1 #include "dynamiclibs.h"
2
3 int dynamic_lib_func_mul(int i1, int i2)
4 {
5     int iret = i1 * i2;
6     printf("... in .so func, %d multiplys %d, retun %d\n", i1, i2, iret);
7     return iret;
8 }

dynamiclib/Makefile 文件内容如下:

 1 CC       = gcc
 2 CFLAGS   = -Wall -g -O -fPIC     需要加上 -fPIC
 3 CXXFLAGS =
 4 INCLUDE  = -I ./inc -I ../comm/inc
 5 TARGET   = libmytest.so
 6 LIBPATH  = ./libs/
 7
 8 vpath %.h ./inc
 9
10 OBJS     = dynamiclib_add.o dynamiclib_mul.o
11 SRCS     = dynamiclib_add.c dynamiclib_mul.c
12
13 $(OBJS):$(SRCS)
14    $(CC) $(CFLAGS) $(INCLUDE) -c $^
15
16 all:$(OBJS)
17    $(CC) -shared -fPIC -o $(TARGET) $(OBJS)    需要加上 -shared -fPIC
18    mv $(TARGET) $(LIBPATH)
19
20 clean:
21    rm -f *.o
22    rm -f $(LIBPATH)*

以上文件,就可以生成动态库文件 libmytest.so,应用程序以两种方式加载动态库函数,如下

2. 在编译应用程序时加载动态库

dynamiclibapp.c 文件内容如下:

 1 #include "apue.h"
 2 #include "dynamiclibs.h"
 3
 4 int main(int argc, char *argv[])
 5 {
 6     err_msg("step in main\n");
 7     dynamic_lib_func_add(1, 9);
 8     dynamic_lib_func_mul(1, 9);
 9     err_msg("step out main\n");
10
11     return 0;
12 }

Makefile 文件内容如下:

 1 CC       = gcc
 2 CFLAGS   = -Wall -O -g
 3 CXXFLAGS =
 4 INCLUDE  = -I ./comm/inc -I ./dynamiclib/inc
 5 TARGET   = dynamiclibapp
 6 LIBVAR   = -lmytest             指明需要链接动态库 libmytest.so
 7 LIBPATH  = -L./dynamiclib/libs  指明 libmytest.so 的路径
 8 #search paths for errorhandler.c
 9 vpath %.c ./comm
10 #下行是为依赖项 apue.h 准备的,比如 [errorhandler.o:errorhandler.c apue.h] 里的 apue.h
11 vpath %.h ./comm/inc
12
13 OBJS     = errorhandler.o dynamiclibapp.o
14 #下行的 apue.h,可以不必写出来
15 errorhandler.o:errorhandler.c apue.h
16    $(CC) $(CFLAGS) $(INCLUDE) -c $^
17 dynamiclibapp.o:dynamiclibapp.c apue.h
18    $(CC) $(CFLAGS) $(INCLUDE) -c $^
19
20 all:$(OBJS) $(LIB)
21    cd ./dynamiclib && make all
22    $(CC) $(CFLAGS) $(INCLUDE) -o $(TARGET) $(OBJS) $(LIBPATH) $(LIBVAR)
23    在上行中,在执行编译时,加载了 libmytest.so 中函数
24 clean:
25    rm -f *.o
26    rm -f comm/inc/*.gch
27    rm -f $(TARGET)
28    cd ./dynamiclib && make clean

对于这种方式编译出来的动态库文件,还需要在 /etc/ld.so.conf.d/ 目录中添加 libmytest.so 库文件的路径说明,

即在 /etc/ld.so.conf.d/ 目录中新建配置文件 mytest.conf,且执行 ldconfig, /etc/ld.so.conf.d/mytest.conf 的文

件内容为 libmytest.so 库文件的绝对路径,例如:

1 /home/lijiangtao/dynamiclib/libs

如果不在编译应用程序时加载动态库文件里的函数,而是改为在应用程序执行时(比如:程序的main函数启动期

间,或在程序执行期间)加载 libmytest.so 里函数,那么就可以不需在 /etc/ld.so.conf.d/ 目录中配置 libmytest.so

路径,具体如下所述。

3. 在应用程序执行时加载动态库

dynamiclibapp.c 文件内容如下:

 1 #include "apue.h"
 2 #include "dynamiclibs.h"
 3 #include <dlfcn.h>
 4
 5 typedef int (*fp_lib_add)(int, int);
 6 typedef int (*fp_lib_mul)(int, int);
 7 typedef void* dlhandle;
 8
 9 dlhandle      dll      = NULL;
10 fp_lib_add    func_add = NULL;
11 fp_lib_mul    func_mul = NULL;
12
13 dlhandle load_dynamic_func(char *psopath, fp_lib_add *padd, fp_lib_mul *pmul);
14
15 int main(int argc, char *argv[])
16 {
17     char *pso = "/home/lijiangtao/dynamiclib/libs/libmytest.so";//指定 .so 路径
18     dll = load_dynamic_func(pso, &func_add, &func_mul);//程序执行时,加载动态函数
19     err_msg("step in main\n");
20     func_add(1, 9);//执行 add 函数
21     func_mul(1, 9);//执行 mul 函数
22     err_msg("step out main\n");
23
24     return 0;
25 }
26
27 dlhandle load_dynamic_func(char *psopath, fp_lib_add *padd, fp_lib_mul *pmul)
28 {
29     if(NULL == psopath ||'\0' == psopath[0])
30         return NULL;
31     char *perrormsg = NULL;
32     dlhandle dllhandle = dlopen(psopath, RTLD_LAZY);
33     if(NULL == dllhandle)
34     {
35         printf("%s\n", dlerror());
36         return NULL;
37     }
38     if(NULL != padd)
39     {
40         *padd = dlsym(dllhandle, "dynamic_lib_func_add");//加载 add 函数
41         perrormsg = dlerror();
42         if(NULL != perrormsg)
43             printf("%s\n", perrormsg);
44     }
45     if(NULL != pmul)
46     {
47         *pmul = dlsym(dllhandle, "dynamic_lib_func_mul");//加载 mul 函数
48         perrormsg = dlerror();
49         if(NULL != perrormsg)
50             printf("%s\n", perrormsg);
51     }
52     return dllhandle;
53 }

Makefile 文件内容如下:

 1 CC       = gcc
 2 CFLAGS   = -Wall -O -g
 3 CXXFLAGS =
 4 INCLUDE  = -I ./comm/inc -I ./dynamiclib/inc
 5 TARGET   = dynamiclibapp
 6 LIBVAR   = -ldl    需要链接 libdl.so 库
 7 LIBPATH  =
 8 #search paths for errorhandler.c
 9 vpath %.c ./comm
10 #下行是为依赖项 apue.h 准备的,比如 [errorhandler.o:errorhandler.c apue.h] 里的 apue.h
11 vpath %.h ./comm/inc
12
13 OBJS     = errorhandler.o dynamiclibapp.o
14 #下行的 apue.h,可以不必写出来
15 errorhandler.o:errorhandler.c apue.h
16    $(CC) $(CFLAGS) $(INCLUDE) -c $^
17 dynamiclibapp.o:dynamiclibapp.c apue.h
18    $(CC) $(CFLAGS) $(INCLUDE) -c $^
19
20 all:$(OBJS) $(LIB)
21    cd ./dynamiclib && make all
22    $(CC) $(CFLAGS) -rdynamic $(INCLUDE) -o $(TARGET) $(OBJS) $(LIBPATH) $(LIBVAR)
23    在上行,执行编译时并没有加载动态接口函数,而是在应用程序执行时加载的;需要 -rdynamic 选项,      以确保 dlopen 这些接口可用
24 clean:
25    rm -f *.o
26    rm -f $(TARGET)
27    cd ./dynamiclib && make clean

对于这种方式编译出来的动态库文件,不需要在 /etc/ld.so.conf.d/ 目录中配置 libmytest.so 库文件的路径说明

Makefile 编译动态库文件及链接动态库相关推荐

  1. 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )

    文章目录 I . CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . 完整代码示例 ...

  2. 头文件和库文件区别,动态库和静态库的区别,动静态库的生成

    文章目录 一.什么是头文件?什么是库文件?有什么区别? 先说总结 目标文件 二.什么是静态库?什么是动态库?有什么区别? 三.为什么只用在程序头部写上包含的头文件,头文件中并没有实现内容就可以使用声明 ...

  3. g++编译后运行时无法链接动态库的解决方法

    问题发现: $ g++ -Wall -o hellobrowser.exec hellobrowser.c -I/usr/local/include -L/usr/local/lib -lmicroh ...

  4. 【Android 逆向】Android 进程注入工具开发 ( 远程进程注入动态库文件操作 | 注入动态库 加载 业务动态库 | 业务动态库启动 | pthread_create 线程开发 )

    文章目录 前言 一.加载 libnattive.so 动态库 二. libnattive.so 动态库启动 三. pthread_create 线程开发 四. 线程执行函数 前言 libbridge. ...

  5. 编译mumps库时无法链接mpi库中的函数

    安装AGMG并行版时需要mumps库.在编译mumps库链接mpi库时ld报错如下, 可以看出ld并没有报找不到mpi库的error,而是报了找到了mpi库但找不到具体的函数实现的error. 我也可 ...

  6. python第三方库文件传输_Python第三方库在Excel文件读写中的应用

    Python第三方库在Excel文件读写中的应用 文/刘卫华1 史婷婷2 许学添1 [摘 要]摘 要 [期刊名称]<电子技术与软件工程> [年(卷),期]2019(000)016 [总页数 ...

  7. java 动态读取文件_Java窗体动态加载磁盘文件的实现方法

    在使用图形界面操作系统时,当打开一个文件夹系统会自动列出该文件夹下的所有文件及子文件夹.本实例实现了类似的功能:首先让用户选择一个文件夹,程序会动态列出该文件夹下的所有文件:如果该文件是隐藏文件,就在 ...

  8. linux安装的库文件,linux – 安装包库和头文件在哪里?

    在Ubuntu中下载并安装软件包后,如何查看库和头文件的写入位置?我相信这与包的.pc文件有关,但我不知道如何找到该文件. 例如,我已经下载了PCL(Point Cloud Library)软件包,然 ...

  9. mysql导入社工库文件_社工库-数据表结构设计和数据导入

    环境: 主机:10.0.1.120 数据库:mysql 5.6 查看数据结构 tail www.csdn.net.sql # csdn格式 LaoZheng # 670xxx # chengxxx@1 ...

最新文章

  1. blog推荐 - 软件产品管理之Tyner Blain
  2. VTK:Math之HomogeneousLeastSquares
  3. HDU-5123-who is the best?
  4. 【小白学云计算】xmpp开源服务器的配置和安装图文详解
  5. 一文掌握Python集合的语法与应用
  6. 洛谷P1429 平面最近点对(加强版)
  7. python如何安装pdfminer_Python3.8安装pdfminer
  8. jsp购物车(session版)
  9. AUTOCAD——三种箭头的画法
  10. 阵列信号处理-学习笔记003-波束形成
  11. asset文件夹路径 unity_Unity资源常用目录和路径大总结
  12. 分享新作:休闲小游戏『Flying Stone』
  13. 基于 Text-CNN 的情感分析(文本分类)----概念与应用
  14. Python 强制限定小数点位数
  15. Android——TextView指定字符串颜色高亮,实现类似微信、支付宝搜索结果中搜索字段高亮的效果
  16. 【IT互联网行业内,什么岗位工作更有前景?】
  17. vue的两个核心是什么
  18. 怎么画因果图?因果图绘图步骤详解
  19. 小而美的LBS应用龙门阵——成都开发者沙龙
  20. Java反射系列--Type接口及其子接口

热门文章

  1. ACT趋之若鹜的发展趋势
  2. 定义带参数的宏来求三角形的面积
  3. 2021.7.15 jzoj题解与反思(2)
  4. 设计世界中的阴阳:带有微妙文字的强大英雄形象
  5. duilib学习------网易云信Grid
  6. JS基础类型的属性赋值问题
  7. 在短信中使用短链接的完整指南
  8. 微风:零基础怎么学PS
  9. vue中用v-modle绑定input来实现百分比的计算
  10. 使用Unity实现动态2D水效果