设计两个动态库
第一个动态库: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_前缀。