|
各位达人
在下最近在工作中碰到一个库连接的同名函数问题,百思不得其解,现将其拿出来请大家帮助我看看究竟是怎么回事。
**求助**
请教各位,谁能跟我解释一下下述现象究竟是为什么?应该如何做才能是输出满足我所期待的结果?
**现象**
1. 编写了以下代码:
- lib3.c: 定义函数func2(), func4(),其中, func4()直接调用func2().该文件中的func2()会输出信息"Func2() from libdrv3.so"
- lib2.c: 定义函数func2(), func3(),其中, func3()调用lib3.c中的func4().该文件中的func2()会输出信息"Func2() from libdrv2.so"。
这里的func2只是为了后续测试存在,写代码时没有真实想要调用。另外,这里的func2的接口声明与lib3.c中的func2()相同。
- lib1.c: 定义函数func1().其中, func1()调用lib2.c中的func3()
- main.c: 定义函数main(). 其中, main()调用lib1.c中的func1()
另外,上述代码在同一目录下。
2. 编译上述代码,命令分别如下:
$gcc -shared -fPIC lib3.c -o libdrv3.so
$gcc -shared -fPIC -ldrv3 -L./ lib2.c -o libdrv2.so
$gcc -shared -fPIC -ldrv2 -L./ lib1.c -o libdrv1.so
$gcc -ldrv1 -L./ main.c -o test
3. 执行上述程序test
$export LD_LIBRARY_PATH=`pwd`{LD_LIBRARY_PATH}
$./test
期待结果: 输出"Func2() from libdrv3.so"
实际结果: 输出"Func2() from libdrv2.so"
这个问题已经困扰我好几天了。不知道为什么错。
我觉得代码写得应该没有问题,我倾向于认为是编译选项存在遗漏考虑。不知道这种想法是否正确。
[解决方法]
参考下述文章:
http://people.redhat.com/drepper/dsohowto.pdf |
|