编译连接动态库时须要注意几个点:spa
1)连接阶段要指定动态库的路径,与运行时要查找的动态库的路径是两个概念。编译
2)连接阶段,若是是经过-l选项指定动态库时,须要搭配-L选项指定连接路径。这要求动态库使用lib前缀。test
若是依赖的动态库没有lib前缀,能够考虑指定动态库的路径,以依赖文件的方式连接。gcc
好比编译动态库c.so,当前路径为c.so的编译路径,依赖于../../test/a.so:file
gcc -shared -fPIC -o c.so c1.c c2.c ../../test/a.so -lrt -ldl -Wl, rpath=./:../testgc
3)运行时阶段,指定要动态装载的动态库的路径,则是经过-Wl,rpath选项来指定。若是是多个路径,则以冒号分隔。好比上述命令指定了当前路径和test路径。makefile
4)注意,rpath所指定的路径,是以可执行文件所在的位置为参照的。而连接指定的路径,是以执行makefile所在的位置为参照的。若是连接指定的路径是错误的,在编译连接阶段就会报找不到依赖文件的错误。而若是rpath指定的路径中没有依赖的动态库,那么在运行时会报找不到依赖文件的错误。能够在编译连接结束后,经过ldd命令查看相关文件的动态库依赖,若是rpath指定的路径中找不到依赖的话,那么在ldd的输出中,依赖项会显示not found。除了ldd外,objdump、nm、readelf等都是分析依赖符号的有效手段。文件