专栏首页Pou光明Linux不同共享库中同名函数的处理

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 ended\n"
$(Target_Dll):$(C_OBJS)
  $(CC) -shared $^ -o $@
  @echo -e "\n>>>>> Compiling *$(Target_Dll)* sucessfully ended\n"
$(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

一、小结

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

本文分享自微信公众号 - Pou光明(pou0230),作者:PouG

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 重载、重写、重定义——三种同名函数的不同处理方式

    在一个类中的重名函数,由于函数参数个数/类型的不同(形参列表不同),导致使用不同的函数进行处理,这种情况称为重载。

    海盗船长
  • 支付类系统数据处理和数据中台的数据处理方式有什么不同?

    在建立数据中台的时候,数据还是来源于各个异构的业务应用系统,实现了数据的统一,但是数据实际上是多存了一份,数据存在冗余,同时数据实时性如何来保证了?针对每个业务...

    春哥大魔王
  • Linux下创建自己的共享库

    本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的本质不同,因此二者库的二进制是不兼容的。

    GavinZhou
  • 借助qt creator创建属于自己的共享库

    在 Windows 上,共享库由 .dll 表示;在 Linux 上,由 .so 表示。

    用户5908113
  • Linux动态链接库.so文件的创建与使用

            使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码...

    阳光岛主
  • Linux共享库、静态库、动态库详解

    使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码...

    sunsky
  • 由一道面试题来了解进程间的通信

    周末面试碰到一个面试题,题目是: 在MMO游戏中,服务器采用Linux操作系统,网络通信与游戏逻辑处理进程一般是分离的。 例如:GameSvr进程处理游戏逻辑,...

    hbbliyong
  • x86架构与x64架构在函数于栈中调用过程的不同之处

    1、x86架构 x86架构是intel开发的一种32位的指令集。8个32位通用寄存器 eax,ebx,ecx,edx,ebp,esp,esi,edi。

    Elapse
  • 动态链接的步骤与实现

    我们知道动态链接器本身也是一个共享对象,但是事实上它有一些特殊性。对于普通共享对象文件来说,它的重定位工作由动态链接器来完成。他也可以依赖其他共享对象,其中的被...

    233333
  • Android跨进程通信IPC之1——Linux基础

    由于Android系统是基于Linux系统的,所以有必要简单的介绍下Linux的跨进程通信,对大家后续了解Android的跨进程通信是有帮助的,本篇的主要内容如...

    隔壁老李头
  • linux下的 lib文件的学习思考

    某日开发说,一台测试用虚机可以PING通SSH不能连了。运维同学就赶紧去查,SSHD_CONFIG配置文件都正确啊,一点错误都没有,那为什么呢?

    孙杰
  • 《深入理解计算机系统》(CSAPP)读书笔记 —— 第七章 链接

    理解链接器将帮助你构造大型程序。构造大型程序的程序员经常会遇到由于缺少模块、缺少库或者不兼容的库版本引起的链接器错误。除非你理解链接器是如何解析引用、什么是库...

    嵌入式与Linux那些事
  • 静态链接库和动态链接库的区别

    Linux下得库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。面对比一下两者:

    狼啸风云
  • Linux下共享库(SO)有关的几个环境变量

    Linux支持共享库已经有悠久的历史了,不再是什么新概念了。大家都知道如何编译、连接以及动态加载(dlopen/dlsym/dlclose) 共享库。但是,...

    一见
  • linux内核中听过就能记住的概念

    静儿
  • Fork三部曲之clone的诞生

    在本文中,传统UNIX fork之后,我给出传统的UNIX fork在Linux内核中的变体clone系统调用的精彩。

    Linux阅码场
  • 浅谈Linux的动态链接库

    上一篇我们分析了Hello World是如何编译的,即使一个非常简单的程序,也需要依赖C标准库和系统库,链接其实就是把其他第三方库和自己源代码生成的二进制目标文...

    PP鲁
  • C语言服务器编程必备常识

    震八方紫面昆仑侠
  • Android 平台 Native 代码的崩溃捕获机制及实现

    一、背景 在Android平台,native crash一直是crash里的大头。native crash具有上下文不全、出错信息模糊、难以捕捉等特点,比jav...

    腾讯Bugly

扫码关注云+社区

领取腾讯云代金券