对于我这个刚入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编过了。哎,看来真的是年轻啊。
至于为什么会这样,在这就不多废话了,有兴趣的码友可以专门去了解一下。
最近遇到个低级错误,记录一下,在linux下生成静态库时报“ar: 给出了两个不同的操作选项”错误
最后发现是因为我在生成静态库时把该静态库依赖的库也加上了,如下
ar -r libzlog.a format.o level.o -lpthread
其中-lpthread是不能写在这的,这句话应该改成ar -r libzlog.a format.o level.o,最后谁用libzlog.a谁添加-lpthread