【发布时间】:2012-10-25 22:39:53
【问题描述】:
我有以下 C 文件:
Base.h:
void g();
void h();
Base.c:
#include <stdio.h>
#include <Base.h>
void g() {
printf("This is lib g\n");
h();
}
void h() {
printf("This is lib h\n");
}
交流:
#include <stdio.h>
#include <Base.h>
void h() {
printf("This is A h\n");
}
void main() {
g();
h();
}
我编译链接如下:
$ gcc -c -fPIC -o Base.o -I. Base.c
$ gcc -shared -o libBase.so Base.o
$ gcc -c -o A.o A.c
$ gcc -o A A.o -lBase -L.
现在我运行程序
$ LD_LIBRARY_PATH=. ./A
并获得:
This is lib g
This is A h
This is A h
也就是说,libBase 中对 h 的调用由 A.o. 的 h 解决。这不是我所期望的。我希望动态链接器使用 libBase 中的 h 解决对 libBase 中 h 的调用,或者在第四个 gcc 调用中出现错误消息。
如果我将 A.c 中的 h 重命名为 h1
#include <stdio.h>
#include <Base.h>
void h1() {
printf("This is A h1\n");
}
void main() {
g();
h1();
}
我得到
This is lib g
This is lib h
This is A h1
因此,在这种情况下,h 按我的预期解决了。
我必须做什么才能获得错误消息或将 g 中的调用解析为 libBase 中的 h?
【问题讨论】: