C语言 调用的动态库函数重名问题分析
2016-04-08 14:36
519 查看
设计两个动态库
第一个动态库:libHelloc:
func1.h
func1.c
libHelloc.h
libHelloc.c
#include "libHelloc.h"
#include "func1.h"
void print_hello() {
printf("!!!Hello World!!!\n");
}
void test1() {
func();
}
第二个动态库libHelloc2:
func1.h
func2.c
libHelloc2.h
libHelloc2.c
设计可执行程序:
helloc.c
当Makefile.am 内容为
a.out 输出:
当Makefile.am内容为:
a.out输出:
总结:
当一个程序引用的两个动态库中存在同名函数时,先被加载的动态库函数有效,后家在的动态库同名函数无效(不会被执行)。并且后加载的动态库中其他函数调用了同名函数时,原本期望是调用本动态库中的函数,事实上调用的是第一个被加载的动态库中的同名函数。这样极有可能造成一些难以理解的程序,因此应当极力避免这种情况发生!
一个设计思路,参考jni生成的代码,引入类似空间的概念:
如 com_hknaruto_demo_libjni.c 其中的函数及全剧变量均采用com_hknaruto_demo_libjni_前缀。
第一个动态库: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_前缀。
相关文章推荐
- C++实现——string的所有操作
- C++中new 一个对象的时候加括号和不加括号的区别
- c语言:用双向链表实现双端队列(队列两端都可以进行入队出队操作)
- C++的<unordered_set>
- [C++]打印三角形&棱形.
- c++11改进我们的模式之改进单例模式
- C++之类的友元函数
- c++上机实验3-判断某一年的月份
- 【C++】 斐波那契数列
- hihoCoder:1039字符串消除
- C++之类型强转
- C++注释规范
- C/C++ typedef 用法小结
- Item 01:视C++为一个语言联邦
- C++ 编译时'setw' was not declared in this scope问题
- (1)c++基础知识
- 类型转换总结
- c++之多线程
- Effective C++:条款29:为“异常安全”而努力是值得的
- C++ string 与 C char *