当前位置:首页 > 日记 > 正文

理解pkg-config工具(Linux编译的帮助)

理解pkg-config工具(Linux编译的帮助)
点评:PKG的配置,这是我们今天要介绍的,提供了解决上述问题的一种美丽的解决方案。从那时起,你不必担心任何更多
你在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方法。

相关文章

网卡eth0在FedoraLinux启动慢启动

网卡eth0在FedoraLinux启动慢启动

启动,慢启动,网卡,电脑软件,FedoraLinux,点评:uff1a 激活eth0慢当Fedora的启动方案 当Fedora的开始,它太长了启动eth0。我怎么能跳过它呢 # / / / sbin目录设置:取消网络激活系统的功能。 在图形界面中,系统——管理——网络——在计算机启…

操作打开Windows7任务栏通知区域中

操作打开Windows7任务栏通知区域中

通知,任务栏,区域,操作,回收站,点评:很多类似的爱酷的桌面软件来存储所有常用图标的人,或只有Windows7任务栏,接下来将介绍给你minibin使用通知区域中的一个小图标,方便回收再利用和再循环等开放手术 许多人不喜欢在桌面上放置任何图标。他们使…

介绍MySQL事件查看器的使用

介绍MySQL事件查看器的使用

事件,查看器,电脑软件,MySQL,查看事件调度程序是否已经打开。 显示变量like'event_scheduler; 打开事件查看器 设置全局event_scheduler = 1; 创建一个事件 Grammar: 创建事件{不存在} event_name 在进度计划 {完成时{ { } } } { } |启用禁…

苹果笔记本(苹果)删除OSX系统安装win

苹果笔记本(苹果)删除OSX系统安装win

系统安装,方法,删除,电脑软件,OSX,问题: 朋友送我一台苹果笔记本电脑(苹果)电脑,它配备了OS X系统,但我很不习惯。我想删除OS X系统,安装Windows7系统,但我不知道如何操作。 答案uff1a 在苹果笔记本MacBook电脑,可以删除OS X系统安装win7系统。 …

avp.exe的过程是怎样的avp.exe是病

avp.exe的过程是怎样的avp.exe是病

常见问题,是怎样,它在,如何识别,过程,点评:在系统avp.exe进程是什么有两个在任务管理器;它是avp.exe病毒现在让我们去了解过程Avp.exe。 的起源和功能 显然,作为一个系统安全保护的过程,avp.exe操作通常可以提高系统的安全性,考虑到Windows系统…

PHP自动获取目录下模板的代码。

PHP自动获取目录下模板的代码。

模板,代码,目录下,电脑软件,PHP,该目录必须有一个default.gif(这个图是一个模板缩略图)作为一个合法的模板 复制代码代码如下所示: get_template()函数 { ($模板=数组); $dir = cms_root。' /物流/; $ = 0; 如果(is_dir($dir)){ 如果($ DH = opendir($dir)){…

如何找到网络连接在win7如何将win7

如何找到网络连接在win7如何将win7

无线路由器,网络连接,如何将,电脑软件,点评:在平时上网的时候,难免会出现一些网络问题。这时,我们需要查看网络连接的状态并找出问题的根源。 在Internet接入的一般过程中,不可避免地会遇到一些网络问题,此时我们需要查看网络连接的状态并找出问…

Fedora安装注意事项

Fedora安装注意事项

安装,注意事项,电脑软件,Fedora,点评:uff1a 分区不能是NTFS格式。 觉得使用自定义分区是好的,我也是在这个条件下的。 自定义分区,分为三: /启动分区用于启动功能125m。 Swrap partition, the role is not too clear, the size is generally 2…

PHP解析XML的暗示无效字节1字节UTF

PHP解析XML的暗示无效字节1字节UTF

错误,无效,字节,序列,暗示,错误提示 无效的字节1字节UTF-8序列 原因分析 编码GBK默认下窗中文版的java,这是确定将XML虽然我们保存为UTF-8格式,但实际上文件存储在GBK格式,所以这就是为什么我们可以使用GBK和GB2312编码来生成XML文件可以正确…

PHP中最容易遗忘的一些知识点

PHP中最容易遗忘的一些知识点

知识点,最容易,电脑软件,PHP,1。定义常数: 复制代码代码如下所示: 1 定义(tax_rate 回声tax_rate; / /输出0.08 2(PHP 5.3) const tax_rate2 = 0.01; 回声--。tax_rate2; / /输出0.01 > 2、要求和require_once: 前者遇到一个文件,而后者决定…

MySQL大表中重复字段的高效查询方

MySQL大表中重复字段的高效查询方

查询,方法,字段,高效,电脑软件,如何查询MySQL大字段重复字段这是许多人遇到的问题。这里是一个MySQL大表重复字段查询方法,供大家参考。 数据库中有一个大表。它需要查找具有重复记录id的数据库名称,以便进行比较。 很容易找到不在数据库中…

改变wmp12在win7默认的解码器的教

改变wmp12在win7默认的解码器的教

解码器,教程,默认,电脑软件,点评:Win7的Windows Media Player媒体播放器的版本是12,只有WMP 12,当使用第三方解码器在播放本地视频文件,它修改注册表编辑器的风险。请注意备份。 在Windows 7中,它自己的Windows媒体播放器媒体播放器12版,Windows…