linux gcc链接选项详解

-I(大写i) -L(大写L) -l(小写l)
(1)-l -I(大写i)
显示指定头文件的搜索路径。

 -I/home/myinclude/ 表示/home/myinclude目录作为第一个寻找头文件的目录,寻找的顺序是:
 /home/myinclude/ -->/usr/include -->/usr/local/include

(2)
-L(大写l)
显示指定程序按照 -L 指定的路径去寻找库文件。

-I/home/lib/ 表示/home/mylib目录作为第一个寻找库文件的目录,寻找的顺序是:
/home/mylib-->/lib-->/usr/lib-->/usr/local/lib

(3)
-l(小写)
指定在上述的lib的路径中寻找*.so动态库文件

-lsqlite3 -lpthread -lcrypto ,-l后面跟着的是动态库的名字,到上述的lib目录寻找libsqlite3.so、pthread.so ,crypto.so动态库文件。

LIBRARY_PATH, LD_LIBRARY_PATH 与ld.so.conf

LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下:

LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录):

export LIBRARY_PATH=LIBDIR1:LIBDIR2:$LIBRARY_PATH

LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径,注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录):

export LD_LIBRARY_PATH=LIBDIR1:LIBDIR2:$LD_LIBRARY_PATH

在linux下,还可以将动态链接目录加到/etc/ld.so.conf中,在 /etc/ld.so.conf中写下“想要读入高速缓存中的动态函数库所在的目录”,注意,是目录而不是文件。然后调用ldconfig。

动态可执行程序中不包含运行所需的所有函数,linux的动态装入器负责装入动态链接的可执行程序运行所需的共享库。
动态装入器找到共享库要依靠两个文件 — /etc/ld.so.conf 和 /etc/ld.so.cache。

$ cat /etc/ld.so.conf
  /usr/X11R6/lib
  /usr/lib/gcc-lib/i686-pc-linux-gnu/2.95.3
  /usr/lib/mozilla
  /usr/lib/qt-x11-2.3.1/lib
  /usr/local/lib

ld.so.conf 文件包含一个所有目录(/lib 和 /usr/lib 除外,它们会自动包含在其中)的清单,动态装入器将在其中查找共享库,LD_LIBRARY_PATH即是指示动态装入器首先检查某个目录。但是在动态装入器能“看到”这一信息之前,必须将它转换到 ld.so.cache 文件中。可以通过运行 ldconfig 命令做到这一点:
ldconfig
  当 ldconfig 操作结束时,系统生成最新的 /etc/ld.so.cache 文件,反映出 /etc/ld.so.conf 所做的更改。从这一刻起,动态装入器在寻找共享库时会查看您在 /etc/ld.so.conf 中指定的所有新目录。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章