C語言 呼叫的動態庫函式重名問題分析
阿新 • • 發佈:2019-01-25
設計兩個動態庫
第一個動態庫: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_字首。