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 
#include 
#include "func1.h"
#include "func2.h"
#include 
#include 
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_前缀。

你可能感兴趣的:(C语言 调用的动态库函数重名问题分析)