Linux下库的设置:ld.so.conf文件与PKG_CONFIG_PATH变量
一、编编和编接
一般编~如果编的编文件不在 来/usr/include 目编中~那编在编编的编候需要用 -I 指定其路。由于同一编在不同系编上参数径个
可能位于不同的目编下~用编安编的编候也可以编安在不同的目编下~所以使使用同一编~由于编的路的 不同~装将装即个径
造成了用 -I 指定的编文件的路也可能不同~其编果就是造成了编编命令界面的不编一。如果使用 参数径-L ~也造参数会
成编接界面的不编一。编编和编接界面不编一编编的使用编麻编。会来
编了解编编和编接界面不编一的编编~人编到了一些解编法。其基本思想就是,事先把编的位置信息等保存起~需要的编决找决来
候再通编特定的工具其中有用的 信息提取出供编编和编接使用。编编~就可以做到编编和编接界面的一致性。其中~目前最将来
编常用的编信息提取工具就是下面介编的 pkg-config。
pkg-config 是通编编提供的一 个.pc 文件编得编的各编必要信息的~包括版本信息、编编和编接需要的等。编些信息可以通参数
编 pkg-config 提供的编提取出编直接供编编器和编接器使用。参数独来
The pkgconfig package contains tools for passing the include path and/or library paths to build tools during the
make file execution.
pkg-config is a function that returns meta information for the specified library.The default setting for PKG_CONFIG_PATH is /usr/lib/pkgconfig because of the prefix we use to install pkgconfig.
You may add to PKG_CONFIG_PATH by exporting additional paths on your system where pkgconfig files are
installed. Note that PKG_CONFIG_PATH is only needed when compiling packages, not during run-time.
在默编情下~每支持 况个pkg-config 的编编编的 .pc 文件在安后都位于安目编中的 装装lib/pkgconfig 目编下。例如~我编在上面已编 将Glib 安在 装/opt/gtk 目编下了~那编编 个Glib 编编编的 .pc 文件是 /opt/gtk/lib/pkgconfig 目编下一个
叫 glib-2.0.pc 的文件,
prefix=/opt/gtk/
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums
Name: GLib
Description: C Utility Library
Version: 2.12.13
Libs: -L${libdir} -lglib-2.0
Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include
使用 pkg-config 的 --cflags 可以编出在编编编所需要的编编~而 参数--libs 可以编出编接编的编编。例如~假编一参数个
sample.c 的程序用到了 Glib 编~就可以编编编编,
$ gcc -c `pkg-config --cflags glib-2.0` sample.c然后编编编接,
$ gcc sample.o -o sample `pkg-config --libs glib-2.0`
或者上面步也可以合编以下一步,两并
$ gcc sample.c -o sample `pkg-config --cflags --libs
glib-2.0`
可以看到,由于使用了 pkg-config 工具编得编的编编~所以不编编安在什编目编下~都可以使用相同的编编和编接命令~编来装来
了编编和编接界面的编一。
使用 pkg-config 工具提取编的编编和编接有基本的前提,参数两个
1.编本身在安的编候必编提供一相编的 装个.pc 文件。不编编做的编编明不支持 pkg-config 工具的使用。
2.pkg-config 必编知道要到里去编此 哪找.pc 文件。
GTK+ 及其依编编支持使用 pkg-config 工具~所以剩下的编编就是如何告编 pkg-config 到里去编编编编的 哪找.pc 文件~编也
是通编编置搜索路解的。径来决
编于支持 pkg-config 工具的 GTK+ 及其依编编编~编的编文件的搜索路的编置编成了编 来径.pc 文件搜索路的编置。径.
pc 文件的搜索路是通编编境编量 径PKG_CONFIG_PATH 编置的~来pkg-config 按照编置路的先后编序编行搜索~直到将径
找到指定的 .pc 文件编止。
安完 装Glib 后~在 bash 中编编编行如下编置,
$ export PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig:
$PKG_CONFIG_PATH
可以编行下面的命令编编是否 /opt/gtk/lib/pkgconfig 路已编编置在 径PKG_CONFIG_PATH 编境编量中,$ echo $PKG_CONFIG_PATH
编编编置之后~使用 Glib 编的其程序或编在编编的编候 它pkg-config 就知道首先要到 /opt/gtk/lib/pkgconfig 编目编中去编个找 glib-2.0.pc 了;GTK+ 和其的依编编的 它.pc 文件也拷编到编里~也首先到编里搜索编编编的 将会它.pc 文件,。之后~通编 pkg-config 就可以把其中编的编编和编接提取出供程序在编编和编接编使用。参数来
另当窗没窗外编需要注意的是,编境编量的编置只编前的编端口有效。如果到了有编行上述编置的编端口中~pkg-config 不将找到新安的 装glib-2.0.pc 文件、而可能使后面编行的安;如 从装Glib 之后的 Atk 的安,无法编行。装
在我编采用的安
中~由于是使用编境编量编 装GTK+ 及其依编编编行的编置~所以系编重新编、或者新编一编当启个
端口之后~如果想使用新安的 窗装GTK+ 编~需要如上面那编重新编置 PKG_CONFIG_PATH 和 LD_LIBRARY_PATH
编境编量。
编编使用 GTK+ 的方法~在使用之前多了一编编编行编置的编程。编然编得稍微繁编了一些~但却是一编最安全的使用 个GTK+ 编的方式~不编系编上已编存在的使用了 会GTK+ 编的程序;比如 GNOME 面,编任何编。桌来冲
编了使编的编置编得编编一些~可以把下面的编句编置保存到一文件中;比如 两个set_gtk-2.10 文件,:export PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig:
$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH
之后~就可以用下面的方法编行编的编置了;其中的 source 命令也可以用 . 代替,,$ source set_gtk-2.10
只有在用新版的 GTK+ 编编编编用程序、或者行使用了新版 运GTK+ 编的程序的编候~才有必要编行上述编置。
如果想避免使用 GTK+ 编之前上述编置的麻编~可以把上面编境编量的编置在系编的配置文件中;如两个 /etc/profile,或者自己的用编配置文件中;如 ~/.bash_profile, ~编的搜索路也可以编置在 径/etc/ld.so.conf 文件中~等等。编编编置在系编编编生效~而编编致使用 启会从会GTK+ 的程序使用新版的 GTK+ 行编~编有可能编一些编编。编然~运会来当
如果编编用新版的 你GTK+ 代替版有什编编编的编~使用编编编置方式是比编方便的。加入到旧没~/.bashrc中~例如,PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig
重之后,启
[root@localhost ~]# echo $PKG_CONFIG_PATH
/opt/gtk/lib/pkgconfig
二、行编运
编文件在编接;编编和共享编,和行;编限于使用共享编的程序,编被使用~其搜索路是在系编中编行编置的。一静运径
般 Linux 系编把 /lib 和 /usr/lib 目编作编默编的编搜索路~所以使用编目编中的编编不需要编行编置搜索路可直两个径两个径即
接使用。编于编于默编编搜索路之外的编~需要编的位置径将径径两添加到 编的搜索路之中。编置编文件的搜索路有下列编方式~可任编其一使用,
1.在编境编量 LD_LIBRARY_PATH 中指明编的搜索路。径
2.在 /etc/ld.so.conf 文件中添加编的搜索路。径
自己可能存将径放编文件的路都加入到/etc/ld.so.conf中是明智的编编 ^_^
添加方法也其编编~编文件的编编路直接编去就极将径写OK了~一行一。例如,个
/usr/X11R6/lib
/usr/local/lib
/opt/lib
需要注意的是,第二编搜索路的编置方式编于程序编接编的编;包括共享编和编编,的定位已编径静足编了~但是编于使用了共享编的程序的编行编是不编的。编是 因编编了加快程序编行编编共享编的定位速度~避免使用搜索路编编共享编的径找低效率~所以是直接编取编列
文件 /etc/ld.so.cache 中编行搜索的。从/etc/ld.so.cache 是一个数它非文本的据文件~不能直接编编~是根据 /etc/ld.so.conf 中编置的搜索路由 径/sbin/ldconfig 命令编些搜索路下的共享编文件将径集中在一起而生成的;ldconfig 命令要以 root 编限编行,。因此~编了保编程序编行编编编的定位~在 /etc/ld.so.conf 中编行了编搜索路的编置之后径~
编必编要行 运/sbin/ldconfig 命令更新 /etc/ld.so.cache 文件之后才可以。ldconfig ,编编的编~的作用就是它将/etc/ld.so.conf列出的路下的编文件 编存到径/etc/ld.so.cache 以供使用。因此安完一些编文件~当装(例如编安装好glib)~或者修改ld.so.conf增加新的编路后~需要行一下径运/sbin/ldconfig使所有的编文件都被编存到ld.so.cache中~如果做~没即使编文件明明就在/usr/lib下的~也是不被使用的~编果编编编程中会抱编~缺少xxx编~去编看编编明明就在那放着~的想搞大编computer蠢猪一。 个^_^
在程序编接编~编于编文件;编编和共享编,的搜索路~静径除了上面的编置方式之外~编可以通编 -L 编式指定。参数因编用 -L 编置的路被编先搜索~所以在编接的编候通常都以编编方式直接指定要编接的编的路。径将会径
前面已编编明编了~编搜索路的编置有编方式,在编境编量 径两LD_LIBRARY_PATH 中编置以及在 /etc/ld.so.conf 文
件中编置。其中~第二编编置方式需要 root 编限~以改编 /etc/ld.so.conf 文件编行 并/sbin/ldconfig 命令。而且~系编重新当启编后~所有的基于 GTK2 的程序在行编都使用新安的 运将装GTK+ 编。不幸的是~由于 GTK+ 版本的改编~编有编会来运编编用程序编兼容性的编编~造成某些程序行不正常。编了避免出编上面的编些情~在 况GTK+ 及其依编编的安编装程中编于编的搜索路的编置采用径将第一编方式编行。编编编置方式不需要 root 编限~编置也编编,$ export LD_LIBRARY_PATH=/opt/gtk/lib:
$LD_LIBRARY_PATH
可以用下面的命令编看 LD_LIBRAY_PATH 的编置内容,
$ echo $LD_LIBRARY_PATH
至此~编的编编置就完成了。两