动态库链接注意事项

Posted jackie-snow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态库链接注意事项相关的知识,希望对你有一定的参考价值。

    编译链接动态库时需要注意几个点:

    1)链接阶段要指定动态库的路径,与运行时要查找的动态库的路径是两个概念。

    2)链接阶段,如果是通过-l选项指定动态库时,需要搭配-L选项指定链接路径。这要求动态库使用lib前缀。

      如果依赖的动态库没有lib前缀,可以考虑指定动态库的路径,以依赖文件的方式链接。

      比如编译动态c.so,依赖于../../test/a.so:

        gcc -shared -fPIC -o c.so c1.c c2.c ../../test/a.so -lrt -ldl -Wl, rpath=./:../abc

    3)运行时阶段,指定要动态装载的动态库的路径,则是通过-Wl,rpath选项来指定。如果是多个路径,则以冒号分隔。比如上述命令指定了当前路径和test路径。

    4)注意,rpath所指定的路径,是以动态库所在的位置为参照的。还是以上述命令为例,编译c.so所在的路径可能是在/home/Jack/poj/xyz下,而链接的动态库则是在/home/Jack/test下。那么rpath所指定的搜索路径则为/home/Jack/test和/home/Jack/test/../abc,即/home/Jack/abc。注意,如果链接指定的路径是错误的,在编译链接阶段就会报no such file的错误。而如果rpath指定的路径中没有依赖的动态库,那么在运行时会报no such file的错误。可以在编译链接结束后,通过ldd命令查看目标文件的动态库依赖,如果rpath指定的路径中找不到依赖的动态库的话,那么在ldd的输出依赖中会显示not found。

以上是关于动态库链接注意事项的主要内容,如果未能解决你的问题,请参考以下文章

动态链接库

动态链接库

动态链接库

mac动态链接库的生成和使用

C#调用C++语言编写的动态链接库

动态链接库引起的yum故障