C语言 调用的动态库函数重名问题分析

设计两个动态库

第一个动态库:libHelloc:

func1.h

#ifndef FUNC1_H_
#define FUNC1_H_

int func1();
void func();

#endif

func1.c

#include "func1.h"

int func1() {
	return 0;
}

void func() {
	printf("func at libHelloc\n");
	printf("invode func1:%d\n", func1());
}

libHelloc.h

#ifndef libHelloc_H
#define libHelloc_H

#include "stdio.h"

void print_hello ();
void test1();

#endif

libHelloc.c

#include "libHelloc.h"
#include "func1.h"

void print_hello() {
    printf("!!!Hello World!!!\n");
}

void test1() {
    func();
}

第二个动态库libHelloc2:

func1.h

#ifndef FUNC1_H_
#define FUNC1_H_

int func1();
void func();

#endif 

func2.c

#include "func1.h"

int func1() {
	return 10;
}

void func() {
	printf("func at libHelloc2\n");
	printf("invode func1:%d\n", func1());
}

libHelloc2.h

#ifndef libHelloc2_H
#define libHelloc2_H

#include "stdio.h"

void print_hello2 ();

void test2();

#endif

libHelloc2.c

#include "libHelloc2.h"
#include "func1.h"

void print_hello2() {
	printf("!!!Hello World2!!!\n");
}

void test2() {
	func();
}

设计可执行程序:

helloc.c


#include <stdio.h>
#include <stdlib.h>
#include "func1.h"
#include "func2.h"
#include <libHelloc.h>
#include <libHelloc2.h>
int main(void) {
	print_hello();
	func();
	test1();
	test2();
	return EXIT_SUCCESS;
}

当Makefile.am 内容为

bin_PROGRAMS=a.out
a_out_SOURCES=helloc.c
AM_CFLAGS= -I/usr/local/include -lHelloc -lHelloc2 -L/usr/local/lib

a.out 输出:

!!!Hello World!!!
func at libHelloc
invode func1:0
func at libHelloc
invode func1:0
func at libHelloc
invode func1:0

当Makefile.am内容为:

bin_PROGRAMS=a.out
a_out_SOURCES=helloc.c
AM_CFLAGS= -I/usr/local/include  -lHelloc2  -lHelloc -L/usr/local/lib



a.out输出:

!!!Hello World!!!
func at libHelloc2
invode func1:10
func at libHelloc2
invode func1:10
func at libHelloc2
invode func1:10


总结:

当一个程序引用的两个动态库中存在同名函数时,先被加载的动态库函数有效,后家在的动态库同名函数无效(不会被执行)。并且后加载的动态库中其他函数调用了同名函数时,原本期望是调用本动态库中的函数,事实上调用的是第一个被加载的动态库中的同名函数。这样极有可能造成一些难以理解的程序,因此应当极力避免这种情况发生!

一个设计思路,参考jni生成的代码,引入类似空间的概念:

如 com_hknaruto_demo_libjni.c 其中的函数及全剧变量均采用com_hknaruto_demo_libjni_前缀。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值