您的位置:首页 > 编程语言 > C语言/C++

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

2016-04-08 14:36 519 查看
设计两个动态库

第一个动态库: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_前缀。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: