趣文网 > 作文大全

Linux不同共享库中同名函数的处理

2020-12-31 14:50:01
相关推荐

场景引入:

在一个尚未成熟的行业中,一般行业标准是先于国家标准。这就导致了开发人员需要做很多兼容工作,再就是会用到很多其他厂商提供的库与头文件,面对不同版本的标准,一般会更新库与头文件。那么此时如果要兼容新库和旧库要做怎样的操作呢?

①当两个C语言共享库之间有同名函数,链接时会报错么?

②如果不报错,调用的顺序是如何确定的呢?

③如果我想兼容两个库,该如何操作呢?(别人的库无法更改函数名、C++可以使用命名空间)

方法是肯定有的,这次先测试①和②效果。

一、创建两个具有同名函数的共享库

1. 文件目录结构

libOne.c是源文件、libOne.c是源文件对应头文件、libOneTest.h是对外暴露的接口头文件。还有一个Makefile文件。

2. 创建共享库与静态库Makefile文件的编写

################################################################## PRIVATE PART ##################################################################APP_TEST_DIR = .# 内部头文件INC_CFLAGS += -I $(APP_TEST_DIR)/Inc# 对外接口目录INC_CFLAGS += -I $(APP_TEST_DIR)/Intf# 动态链接库#LDFLAGS += -lName -lName# 源文件CSRC += $(APP_TEST_DIR)/Src/*.cC_OBJS += $(patsubst %.c,%.o,$(wildcard$(CSRC)))# 动态库编译标志DEBUG = yifeq ($(DEBUG),y)DEBUG_CFLAGS += -DDEBUGDEBUG_CFLAGS += -gendifCFLAGS += -cCFLAGS += -OsCFLAGS += -WallCFLAGS += -fPIC#CFLAGS += -fvisibility=hidden #隐藏属性CFLAGS += $(DEBUG_CFLAGS)# 目标文件Target_Lib=$(APP_TEST_DIR)./Lib/libOne.aTarget_Dll=$(APP_TEST_DIR)./Lib/libone.soTARGET = $(Target_Lib)$(Target_Dll)# 编译规则all:$(TARGET)$(Target_Lib):$(C_OBJS)$(AR) rcs $@$^ @echo -e "n>>>>> Compiling *$(Target_Lib)* sucessfully endedn"$(Target_Dll):$(C_OBJS)$(CC) -shared $^ -o $@ @echo -e "n>>>>> Compiling *$(Target_Dll)* sucessfully endedn"$(C_OBJS):%.o:%.c$(CC)$(CFLAGS)$(INC_CFLAGS)$< -o $@.PHONY:all clean clean: -rm -f $(C_OBJS) -rm -f $(TARGET)

我一般是当模板用的,没咋研究。。。这些东西改着改着就会了。我喜欢camke...

3. libOne.c源程序

#include"libOne.h"#include// #define OPEN_API_LIBONETEST_SRC __attribute__((visibility("default")))#define OPEN_API_LIBONETEST_SRCOPEN_API_LIBONETEST_SRC intmyPrintf(){printf("Hi , I am is lib One ! n");return0;}

define OPEN_API_LIBONETEST_SRC __attribute__((visibility("default")))后面再做介绍。

4. 生成共享库效果

两个共享库中有同名函数myPrintf(),输出内容不同。

二、测试共享库

1. 目录结构

myAppTest是程序执行环境

env.sh内容:export LD_LIBRARY_PATH=. 配置共享库路径为当前路径

2. Makefile文件

TARGET=appTest########CC=g++#CC=arm-linux-gnueabi-gccCFLAG=-g -Wall INCLUDE=-I../includeSRC += main.cLIB=-L../lib -lone -ltwoall:$(CC)$(CFLAG)$(INCLUDE)$(SRC)$(LIB) -o $(TARGET)

3. main.c源文件

#include#include"libOneTest.h"#include"libTwoTest.h"intmain(){ myPrintf();return0;}

4. 程序执行效果

①链接库的顺序为LIB=-L../lib -lone -ltwo

②链接库的顺序为LIB=-L../lib -ltwo -lone

一、小结

当两个共享库中有同名函数时,调用函数顺序取决于链接库顺序。

阅读剩余内容
网友评论
相关内容
延伸阅读
小编推荐

大家都在看

最美交警作文 文具的故事作文 文字博物馆作文 十年后的学校作文 以作业为题写一篇作文 难忘的小学生涯作文 谁笑了作文500字 以吃亏为话题的作文 过生日英语作文 对自己说的话作文 汉字的启示作文 有关乡愁的作文 手机对我的影响作文 小学三年级作文我的老师 高考作文结构模式套用 老鼠的自述作文400字 三年级孩子不会写作文怎么办 关于初一生活的作文 语言描写 作文 争做新时代好少年作文400字 保护环境作文800字 如果重回那一天作文 素质教育作文 六级作文句型 小汽车作文300字 保护环境高中作文 初中作文教学设计 科技是把双刃剑作文 关于抄袭的作文 周杰伦稻香作文