-l -L 以及 相关知识点

这两个命令从根本上来说作用是一样的,都是服务于链接时的库加载( 动态库.so  静态库.a)

但是他们的作用是迥然不同的:-L和-I一样,用来指定搜索路径,-l则是用来指定链接时需要链接的库的名字


生成静态库:gcc -o func1.o func1,c

                    gcc -o func2.o func2.c

                    ar -rcs libfunc.a func1.o func2.o

生成动态库:gcc -o func1.o func1.c

                    gcc -o func2.o func2.c

                    gcc -shared -fPIC -o libfunc.so func1.o func2.o


-l    :    仅在/lib  /usr/lib  和  /usr/local/lib 目录下查找。

                比如: gcc  -o 1 1.c -lfunc        (假设libfunc.a或者libfunc.so文件在上面三个目录中的任意一个中)

-L   :    指定库文件的搜索目录

                比如 : gcc -o 1 1.c -L./ -lfunc     (假设libfunc.a或者libfunc.so文件在当前目录下)


tips:

1.如果动态库和静态库同名且都可被搜索到,那么如果不适用-static选项,默认优先使用动态库

        强制使用静态库:gcc -o 1 1.c -static -lfunc

2.为什么库的命名必须以lib开头?为什么-l选项不跟库文件的全名?

3.

对于动态库,libtest.so库只是在目标程序里做了标记,在运行程序时才会动态加载,那么从哪加载呢?加载目录会由/etc/ld.so.conf来指定,一般默认是/lib、/usr/lib,所以要想让动态库顺利加载,你可以将库文件copy到上面的两个目录下,或者设置export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/XXX/YYY,后面为你自己动态库的目录,再或者修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾,并执行ldconfig刷新。这样,加入的目录下的所有库文件都可见。

另外还有个文件需要了解/etc/ld.so.cache,里面保存了常用的动态函数库,且会先把他们加载到内存中,因为内存的访问速度远远大于硬盘的访问速度,这样可以提高软件加载动态函数库的速度了。

参考:https://www.cnblogs.com/zhangxuan/p/5382946.html

猜你喜欢

转载自blog.csdn.net/ykun089/article/details/80080773
l
今日推荐