理解pkg-config工具(Linux编译的帮助)
你在Unix或Linux下开发软件了吗完成一个程序,编译运行正常,在你的机器上运行良好,你把它放在源代码管理系统中。然后,告诉你的同事你可以把它拿下来。这时,你有一个长长的呼吸,几天的工作不会白费,多么新鲜的空气啊,你开始浮起来。
嗨,你是怎么编译的Rdquo:你仍然沉浸在那种美妙的感觉中,你的双臂充满力量,似乎没有什么问题不能使你失望。此时此刻,那个白痴已经在向你尖叫了。
Ldquo;不,我有一个好的方面!Rdquo:表面上你说话很有礼貌,事实上,你的心已经开始了,愚蠢的,不知道该怎么处理,也许你认为这是对的。上次,他犯了一个简单的错误。难道你不去解决它吗。
在他打了三次电话后,你不得不放下工作。美妙的感觉消失了。如果你没有控制好你的情绪,你的胃就会向他扩散。在你进入他的电脑之前,打个手势,然后优雅地向后推。它怎么会出错呢你是充满信心的。然而,屏幕上的结果有点脸红,该死的,怎么能libxxx.so无法得到它
在你抬头 / usr目录libxxx.so,一切都逃不过你的眼睛。奇怪, / usr /局部/ lib下libxxx.so是怎样的,不应该是 / usr / lib下您不能责怪其他人,如果其他人想安装的话,下一次可能会安装在目录中。
上述场景并不是虚构的,我也经历过几次,显然对这台机器,在别人的机器甚至不能编译。也许两人的操作系统是完全相同的,安装所需要的库,只是因为不同的个人喜好,分别安装在不同的目录中。的情况下,每次都是在过去的巧,与贴片式方法,心里总是想着其他地方不能工作。
PKG的配置,这是我们今天要介绍的,提供了解决上述问题的一种美丽的解决方案。从那时起,你不用担心任何more.pkg-config提供以下功能:
检查库的版本号。如果所需版本的库不符合要求,它会打印出错误信息,并避免链接错误版本的库文件。
获取编译预处理参数,如宏定义、头文件的位置。
获取链接参数,如库的位置和依赖的其他库、文件名和一些其他连接参数。
添加依赖于自动的其他库集。
所有这些都是自动的。安装库文件在哪里并不重要!
在我们使用它,让我们对pkg-config原则谈。pkg-config不是向导,我们可以得到上述信息。事实上,为了pkg-config得到这个信息,图书馆的服务提供商需要提供的电脑文件。例如,在GTK+ 2的PC文件内容如下:
复制代码代码如下所示:
前缀= / usr
exec_prefix = / usr
libdir = / / lib目录
includedir = / usr /包括
目标= X11
gtk_binary_version = 2.4.0
gtk_host = i386 RedHat Linux GNU
名称:GTK+
描述:GIMP工具包($ {目标}目标)
2.6.7版本:
要求:金东康至{目标} - 2攻击力
LIBS:l美元libdir } { - lgtk - $ {目标} 2
Cflags:我includedir美元/ gtk-2.0 { }
这个文件通常放在/ usr /自由/ pkgconfig / / / / lib目录的地方pkgconfig / /,也可以放在其他地方,例如,X11相关电脑文件放置 / usr / / / pkgconfig.in X11R6自由秩序对于pkgconfig找到你的电脑文件,你想设置的环境变量pkg_config_path PC文件的路径。
用pkg-config的ndash;CFLAGS参数可以给你需要在编译时的选项而ndash;LIBS参数可以给连接的选项。例如,如果一个样品。C程序使用glib库,可以这样编写:
复制代码代码如下所示:
$ gcc C ` pkg-config ndash;glib-2.0 ` CFLAGS C样品。
然后连接起来:
复制代码代码如下所示:
$ gcc样品。O O样品` pkg-config ndash;LIBS glib-2.0 `
或者以上两个步骤可以合并为以下步骤:
复制代码代码如下所示:
$ gcc样品。C O样品` pkg-config ndash;CFLAGS ndash;LIBS glib-2.0 `
可以看出:由于pkg-config工具是用来获得图书馆的选择,无论是安装目录的图书馆,它可以使用相同的编译和连接命令,使统一的编译和连接界面。
使用pkg-config工具提取和图书馆连接参数的编制有两个基本的先决条件:
这个机构必须提供相应的文件。安装时PC(不使用这个库不支持pkg-config工具)。
pkg-config必须知道在哪里可以找到这个电脑文件。
GTK+及其依赖库支持pkg-config工具的使用,所以剩下的问题就是如何告诉pkg-config哪里能找到相应的电脑文件,并通过寻找解决的路径设置。
对于GTK+及其依赖库支持pkg-config工具,为图书馆的头文件的搜索路径的设置成为一个设定的。PC文件搜索路径的搜索路径。电脑文件设置的环境变量pkg_config_path。pkg-config将根据设定的路径,直到指定的搜索。电脑文件被发现。
圆滑的安装后,下面的设置应该在狂欢了:
复制代码代码如下所示:
美元的出口pkg_config_path = / / /选择GTK库 / pkgconfig:pkg_config_path美元
下面的命令可以执行检查是否 / / /选择GTK库 / pkgconfig路径被设置在pkg_config_path环境变量:
复制代码代码如下所示:
$ echo $ pkg_config_path
这样设置之后,其他程序或库使用Glib库在编译的时候pkg-config知道先去 / / /选择GTK库 / pkgconfig目录找到glib-2.0.pc(GTK+和其他依赖图书馆。PC文件将被复制到这里,这里将成为搜索相应的。PC文件第一)。之后,和图书馆连接参数编译可提取pkg-config的程序被使用时,它被编译和连接。
也要注意环境变量的设置只适用于目前的终端窗口的重要。如果没有终端窗口,在上面的设置、pkg-config将找不到新安装的glib-2.0.pc文件,以便后续的安装(如后油嘴Atk无法进行安装)出。
在我们使用的安装方案,是环境变量对GTK+和图书馆设置的依赖使用,所以当系统重新启动,或打开一个终端窗口,如果你想用一个新的GTK+库的安装,如上面的重置pkg_config_path和ld_library_path环境变量。
这种使用GTK+方法建立图书馆在使用过程中,虽然有点繁琐,它使用GTK+的最安全的方式,它不影响任何现有的GTK+程序,如GNOME桌面。
为了使图书馆更简单的设置,您可以保存以下文件中的两个句子(如set_gtk-2.10文件):
复制代码代码如下所示:
出口pkg_config_path = / / /选择GTK库 / pkgconfig:pkg_config_path美元
出口ld_library_path = / / /选择GTK库ld_library_path美元
之后,您可以用以下方法设置库(可以使用源命令):
复制代码代码如下所示:
源set_gtk-2.10美元
这是必要的只有当应用程序是一个新的GTK+库版本的开发,或者当一个新的GTK+库版本运行。
如果你想避免在使用GTK+库和麻烦的设置,可以把上述两个环境变量的设置在系统配置文件(如 / /型材等)或自己的用户配置文件(如~ /。bash_profile);搜索路径库还可以设定 / / ld.so.conf等文件,等。这个设置会影响系统启动的时候,这将导致GTK+程序使用GTK+运行新版本的使用,这可能会带来一些问题。当然,如果你发现有与GTK+不是老版本的新版本没有问题,这是使用安装更方便。
库文件是用于连接(静态库和共享库)和运行(仅限于使用共享库的程序),和它的搜索路径是在系统中设置。一般Linux系统以 / / usr /自由和自由两目录作为默认的库搜索路径,所以使用这些两目录库不需要设置搜索路径,所以可以直接使用,默认的库搜索路径之外的图书馆,图书馆的位置需要被添加到库的搜索路径,有两种方式的库文件设置搜索路径,你可以选择他们中的一个:
图书馆的搜索路径的环境变量指定的ld_library_path。
添加搜索路径的图书馆 / / ld.so.conf文件等。
这是添加的路径 / / ld.so.conf等,你可以存储库文件,一个明智的选择。(^ _ ^)
另外,将库文件的绝对路径直接写入OK、一行和一行也是非常简单的:
复制代码代码如下所示:
/ usr / / lib X11R6
/ usr /局部/ lib
应该指出的是,第二搜索路径的位置足够位置的图书馆,包括共享库和静态库,但没有足够的程序使用的共享库。这是因为,为了加快共享库的位置,避免共享库的低效的搜索,我们可以阅读图书馆列表文件/ etc / ld.so.cache直接。 / / ld.so.cache等是非文本数据文件,不能直接编辑,它是基于搜索路径设置在/ etc / ld.so.conf由 / sbin /要想命令搜索路径下生成库文件共享(要想命令执行权限根)。因此,为了保证图书馆的位置执行程序时,后设置了搜索路径 / / ld.so.conf等,则需要运行 / sbin /要想命令更新 / / ld.so.cache等文件。Ldconfig,一个简单的方式,它的功能是缓存文件的路径 / / ld.so.conf等/等/ ld.so.cache上市下使用。所以当你安装一些文件(如安装新的或修改的新图书馆巧舌如簧的路径后ld.so.conf增加)需要运行 / sbin /要想让所有的库文件缓存到ld.so.cache,如果不这样做,即使清楚在/ usr / lib库文件,也不会用,编译有错误的过程中,XXX图书馆查看发现放清楚该公司的不足,给计算机猪。(^ _ ^)
在程序连接期间,除了上述设置之外,还可以显式地指定库文件(静态库和共享库)的搜索路径。因为首先要搜索L的路径集,通常要以这种方式直接指定要连接的库的路径。
正如我之前提到的,有两种方法设置库搜索路径:设置环境变量ld_library_path放在 / / ld.so.conf文件等。其中,第二安装需要root权限更改 / / ld.so.conf等文件和执行/ sbin /要想指挥而且,在系统重新启动后,所有基于GTK2的程序将在运行时使用新安装的GTK+库。不幸的是,由于在GTK+版本的变化,这有时会带来兼容性问题的应用程序,导致程序运行不正常。为了避免这些情况,建立图书馆的搜索路径的第一个方法是安装GTK+及其依赖库。这个设置不需要root权限,而且设置很简单:
复制代码代码如下所示:
美元的出口ld_library_path = / / /选择GTK库ld_library_path美元
下面的命令可以用来查看的ld_libray_path设置内容:
复制代码代码如下所示:
$ echo $ ld_library_path
最后,我总结。PC路径的pkg_config_path文件,所以pkg-config工具可以动态地根据内容的电脑文件的生成和编译连接选项,如CFLAGS和LIBS(编译)(连接),如果你使用的是动态链接库,然后在连接运行程序,一般 / lib Linux系统和 / usr / lib目录作为默认两库搜索路径,除了默认的库搜索路径的数据库,系统管理员可设置ld_library_path环境变量或搜索路径 / / ld.so.conf等文件的那卡卡酷。值得注意的是,使用GCC的连接选项,如果你不使用pkg-config工具显示动态C连接库连接语句。使用GCC的学生可以检查以下注意事项。
在Linux系统中,为了让动态链接库是在系统的其它程序共享,其名称应在库的格式。所以,如果一个动态链接库不符合这种格式,Linux操作系统的动态链接库的自动装载机(LD)将不搜索这个链接库,也可以其他程序共享的格式,首先是通常表示为一个速记的名字,二*通常表示为库的版本号。在我的系统中,最基本的C++动态链接库的名字是libc。所以。6,和线程的线程的动态链接库叫libpthread。所以。0等等。如果没有版本号是指定的,如libmy.so,这也是一个需要的格式。
GCC命令几个重要选项:
共享此选项指定动态连接库的生成,它允许连接器生成T类型的导出符号表,有时生成弱连接类型W的导出符号。它不需要外部应用程序就不能连接。它相当于一个可执行文件。
在于:一是编译代码是位置无关。如果不使用此选项,编译后的代码是位置依赖的,因此动态加载是通过代码复制的方式来满足不同进程的需要,但不能达到真正的代码段共享的目的。
l:表示要连接的库在当前目录中。
-我的:有隐式的命名规则当编译器查找动态连接库,即添加库之前给定的名称,然后添加。所以确定库的名称(libmy。所以)。
当然,如果你有root权限,可以修改 / / ld.so.conf等文件,然后调用/ sbin /要想达到相同的目标,但如果没有root权限,你可以只使用输出ld_library_path方法。