这两个命令都是服务于链接时的库加载( 动态库.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.对于动态库,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,里面保存了常用的动态函数库,且会先把他们加载到内存中,因为内存的访问速度远远大于硬盘的访问速度,这样可以提高软件加载动态函数库的速度了。