关于自定义函数与静态库中函数重名不报错问题的解决

上回书说道,在测试lapack的过程中,编写了main函数,同时在libf2c.a中同样定义了main函数,但上述两个函数在链接并未出现重定义错误。

对此事甚感疑惑,遂用了些时间查了些资料,解决了上述问题。现把解决问题的过程及思路写下来,与大家进行交流。

主要参考的文章:http://tonybai.com/2010/10/11/start-with-mock-malloc/

这篇文章的作者同样遇到了函数名相同,但未出现重定义错误的问题,同时程序运行逻辑正确的情况。

究其原因,是由于编译器对于目标文件与静态库文件处理方式造成,编译器在静态链接过程中一条很重要的原则就是“按需”链接,其中很重要的一点就是“按需”。

以我的理解“按需”有两层含义,第一层含义就是“将需要的模块从.a文件中提取出来,并链接成为可执行文件”;第二层含义就是“对于不需要的模块,不再链接进入可执行文件”,对于本次出现的问题,第二点的理解对于第一点更加重要。按照上述文章中给出的分析,结合我们程序的实际情况,问题就有了答案:

main函数在编译为.o文件时已经被放入“defined集合”,因此在链接环节中就不再提取libf2c.a中的main.o。其实这一点通过我们在上一篇博文中的实验已经有所证实,libf2c.a将main.o删除后并未对编译结果造成影响,已经从侧面证实了main.o模块并未被链接进最终的可执行文件。

写到这里,其实在编译过程中“对‘dgesvd_’未定义的引用”的错误也就有了解答,一开始编译脚本是将库函数放在用户程序前,此时编译器当然无法确定静态库中那些函数会被调用,因此在静态库blas_LINUX.a中的模块一个也没有被提取,而libf2c.a中的main.o就被当作了主函数,最后在链接my_test_lapack.c时再次出现了main函数,也就造成了main函数的重定义错误。

你可能感兴趣的:(关于自定义函数与静态库中函数重名不报错问题的解决)