linux下编译自己的静态库时依赖其他的动态库,使用时出现“undefined reference to”

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/musi35221/article/details/81450643

        对于我这个刚入IT行业不就得新手来说,在linux下链接库的时候总是会遇到各种各样奇葩的问题,最多的就是“undefined reference to”和“cannot find”这两类,层出不穷,总是在我即将完成工作的时候给我当头一棒,让我欲罢不能。这不,这几天编译linux下一个项目时又遇到难题了。

        在我编译的项目中,其中需要编译一个静态库(下面命名为libA.a),而libA.a需要依赖另外两个动态库(下面命名为libB.so和libC.so),刚开始在编译libA.a时,提示找不到libB.so和libC.so里面的函数接口。然后看了一下Makefile,便发现了原因。这个不难。原来是我只在由.o文件连接成.a文件时有链接了libB.so和libC.so动态库,但是在由.c编译成.o时并没有链接libB.so和libC.so。所以这一步直接提示找不到动态库里面的函数接口。按照上面的错误原因修改Makefile之后,便轻易地编译成功了。

        就在我以为一切都大功告成的时候,我才发现我又高兴的太早了。当我将编译好的libA.a以及它所依赖的libB.so和libC.so都连接在项目中时(像我一样的新手千万别忘了,这个依赖的是动态库,要连同一起连接在项目中,我就吃过亏),编译出现的错误,错误内容还是“undefined reference to”libB.so和libC.so里面的函数接口。我当时就蒙了,这是什么情况,我明明都链接进去了啊,为什么还是这样。从错误的提示内容可以看出libA.a里面的函数接口都正常,唯独libB.so和libC.so他们两个里面的函数接口找不到。我就怀疑是不是没有找到这两个动态库或者链接出错之类的,折腾了一会我发现我又错了,如果没链接成功会有类似“cannot find”之类的提示。所以说链是链接上了,可为什么还是找不到呢。就在我百思不得其解时,突然一个念头从脑海中闪过“顺序”,难道问题是出在我连接库的顺序上?当前的顺序是先连接的libB.so和libC.so,然后再链接libA.a。于是我抱着一丝希望将libA.a调到了libB.so和libC.so两个前面,先连接libA.a,运行make。。。真TM编过了。哎,看来真的是年轻啊。

        至于为什么会这样,在这就不多废话了,有兴趣的码友可以专门去了解一下。

展开阅读全文

没有更多推荐了,返回首页