Linux不同共享库中同名函数的处理
时间:2022-07-26
本文章向大家介绍Linux不同共享库中同名函数的处理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
场景引入:
在一个尚未成熟的行业中,一般行业标准是先于国家标准。这就导致了开发人员需要做很多兼容工作,再就是会用到很多其他厂商提供的库与头文件,面对不同版本的标准,一般会更新库与头文件。那么此时如果要兼容新库和旧库要做怎样的操作呢?
①当两个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/*.c
C_OBJS += $(patsubst %.c,%.o,$(wildcard $(CSRC)))
# 动态库编译标志
DEBUG = y
ifeq ($(DEBUG),y)
DEBUG_CFLAGS += -DDEBUG
DEBUG_CFLAGS += -g
endif
CFLAGS += -c
CFLAGS += -Os
CFLAGS += -Wall
CFLAGS += -fPIC
#CFLAGS += -fvisibility=hidden #隐藏属性
CFLAGS += $(DEBUG_CFLAGS)
# 目标文件
Target_Lib=$(APP_TEST_DIR)./Lib/libOne.a
Target_Dll=$(APP_TEST_DIR)./Lib/libone.so
TARGET = $(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 <stdio.h>
// #define OPEN_API_LIBONETEST_SRC __attribute__((visibility("default")))
#define OPEN_API_LIBONETEST_SRC
OPEN_API_LIBONETEST_SRC int myPrintf()
{
printf("Hi , I am is lib One ! n");
return 0;
}
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-gcc
CFLAG=-g -Wall
INCLUDE=-I../include
SRC += main.c
LIB=-L../lib -lone -ltwo
all:
$(CC) $(CFLAG) $(INCLUDE) $(SRC) $(LIB) -o $(TARGET)
3. main.c源文件
#include <stdio.h>
#include "libOneTest.h"
#include "libTwoTest.h"
int main()
{
myPrintf();
return 0;
}
4. 程序执行效果
①链接库的顺序为LIB=-L../lib -lone -ltwo
②链接库的顺序为LIB=-L../lib -ltwo -lone
一、小结
当两个共享库中有同名函数时,调用函数顺序取决于链接库顺序。
- Java常用类(五)之集合工具类Collections
- Windows8小技巧(1)—Map Network Drive
- mysql: Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for opera
- tomcat 8.5.9.0 解决catalina.out过大的问题
- 物联网是如何驱动网络变革的?——上
- Java常用类(四)之数组工具类Arrays
- java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()Z 的解决
- JS魔法堂:定义页面的Dispose方法——[before]unload事件启示录
- HashSet/HashMap详解
- Ajax大显身手
- bash编程之xargs实用技巧
- 表单验证和正则表达式
- ELK日志系统:Elasticsearch + Logstash + Kibana 搭建教程
- 兰花协议—让世界自由的互联网
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 终极干货,数组去重且显示每一个数据重复的次数
- VUE引入 script, link
- Flutter Text(文本控件)
- 纯JS实现在一个字符串b中查找另一个字符串a出现的所有位置,并且不使用字符串的方法(递归)
- 【剑指Offer】替换空格
- 面试汇总(一):针对百度面试总结
- Shell awk命令
- 【redis6.0.6】redis源码慢慢学,慢慢看 -- 第五天:adlist
- redis学习(十一)
- 互联网软件常见开发方法
- 利用Vue实现简易tab切换效果
- 第3天:最近笔试编程题汇总
- 设计模式学习(四)-UML中的类图及类图之间的关系
- 数据结构与算法(一)——学习工具的推荐
- sparc v8架构的异常处理