1. 程式人生 > >C語言 呼叫的動態庫函式重名問題分析

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_字首。