Makefile 编译动态库文件及链接动态库
原文转自 :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 编译动态库文件及链接动态库相关推荐
- 【Android NDK 开发】Android Studio 使用 CMake 导入动态库 ( 构建脚本路径配置 | 指定动态库查找路径 | 链接动态库 )
文章目录 I . CMake 引入动态库与静态库区别 II . Android Studio 中 CMake 引入动态库流程 III . 指定动态库查找路径 IV . 链接函数库 V . 完整代码示例 ...
- 头文件和库文件区别,动态库和静态库的区别,动静态库的生成
文章目录 一.什么是头文件?什么是库文件?有什么区别? 先说总结 目标文件 二.什么是静态库?什么是动态库?有什么区别? 三.为什么只用在程序头部写上包含的头文件,头文件中并没有实现内容就可以使用声明 ...
- g++编译后运行时无法链接动态库的解决方法
问题发现: $ g++ -Wall -o hellobrowser.exec hellobrowser.c -I/usr/local/include -L/usr/local/lib -lmicroh ...
- 【Android 逆向】Android 进程注入工具开发 ( 远程进程注入动态库文件操作 | 注入动态库 加载 业务动态库 | 业务动态库启动 | pthread_create 线程开发 )
文章目录 前言 一.加载 libnattive.so 动态库 二. libnattive.so 动态库启动 三. pthread_create 线程开发 四. 线程执行函数 前言 libbridge. ...
- 编译mumps库时无法链接mpi库中的函数
安装AGMG并行版时需要mumps库.在编译mumps库链接mpi库时ld报错如下, 可以看出ld并没有报找不到mpi库的error,而是报了找到了mpi库但找不到具体的函数实现的error. 我也可 ...
- python第三方库文件传输_Python第三方库在Excel文件读写中的应用
Python第三方库在Excel文件读写中的应用 文/刘卫华1 史婷婷2 许学添1 [摘 要]摘 要 [期刊名称]<电子技术与软件工程> [年(卷),期]2019(000)016 [总页数 ...
- java 动态读取文件_Java窗体动态加载磁盘文件的实现方法
在使用图形界面操作系统时,当打开一个文件夹系统会自动列出该文件夹下的所有文件及子文件夹.本实例实现了类似的功能:首先让用户选择一个文件夹,程序会动态列出该文件夹下的所有文件:如果该文件是隐藏文件,就在 ...
- linux安装的库文件,linux – 安装包库和头文件在哪里?
在Ubuntu中下载并安装软件包后,如何查看库和头文件的写入位置?我相信这与包的.pc文件有关,但我不知道如何找到该文件. 例如,我已经下载了PCL(Point Cloud Library)软件包,然 ...
- mysql导入社工库文件_社工库-数据表结构设计和数据导入
环境: 主机:10.0.1.120 数据库:mysql 5.6 查看数据结构 tail www.csdn.net.sql # csdn格式 LaoZheng # 670xxx # chengxxx@1 ...
最新文章
- blog推荐 - 软件产品管理之Tyner Blain
- VTK:Math之HomogeneousLeastSquares
- HDU-5123-who is the best?
- 【小白学云计算】xmpp开源服务器的配置和安装图文详解
- 一文掌握Python集合的语法与应用
- 洛谷P1429 平面最近点对(加强版)
- python如何安装pdfminer_Python3.8安装pdfminer
- jsp购物车(session版)
- AUTOCAD——三种箭头的画法
- 阵列信号处理-学习笔记003-波束形成
- asset文件夹路径 unity_Unity资源常用目录和路径大总结
- 分享新作:休闲小游戏『Flying Stone』
- 基于 Text-CNN 的情感分析(文本分类)----概念与应用
- Python 强制限定小数点位数
- Android——TextView指定字符串颜色高亮,实现类似微信、支付宝搜索结果中搜索字段高亮的效果
- 【IT互联网行业内,什么岗位工作更有前景?】
- vue的两个核心是什么
- 怎么画因果图?因果图绘图步骤详解
- 小而美的LBS应用龙门阵——成都开发者沙龙
- Java反射系列--Type接口及其子接口