`
lxy2330
  • 浏览: 468375 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

总结configure,pkg-config和PKG_CONFIG_PATH

 
阅读更多
我想大家都在linux下用源码安装过软件,源码安装软件的第一步是啥?下载源码,没错,小王,你太有才了..

      其实真正的第一步是./configure.似曾相识哦。没错,那么我也时常见过pkg-config及pkg_config_path.这几这到底啥关系呢,这就是今天的主题。

      1.什么是configure

      configure会根据传入的配置项目检查程序编译时所依赖的环境以及对程序编译安装进行配置,最终生成编译所需的Makefile文件供程序Make 读入使用进而调用相关编译程式(通常调用编译程序都是gcc)来编译最终的二进制程序。而configure脚本在检查相应依赖环境时(例:所依赖软件的版本、相应库版本等),通常会通过pkg-config的工具来检测相应依赖环境。

      2.什么是pkg-config

      pkg-config用来检索系统中安装库文件的信息,典型的是用作库的编译和连接。一般来说,如果库的头文件不在/usr/include目录中,那么在编译的时候需要用-I参数指定其路径。由于同一个库在不同系统上可能位于不同的目录下,用户安装库的时候也可以将库安装在不同的目录下,所以即使使用同一个库,由于库的路径的不同,造成了用-I参数指定的头文件的路径和在连接时使用-L参数指定lib库的路径都可能不同,其结果就是造成了编译命令界面的不统一。可能由于编译,连接的不一致,造成同一份程序从一台机器copy到另一台机器时就可能会出现问题。
      pkg-config 就是用来解决编译连接界面不统一问题的一个工具。基本思想:pkg-config是通过库提供的一个.pc文件获得库的各种必要信息的,包括版本信息、编译和连接需要的参数等。需要的时候可以通过pkg-config提供的参数(–cflags, –libs),将所需信息提取出来供编译和连接使用。这样,不管库文件安装在哪,通过库对应的.pc文件就可以准确定位,可以使用相同的编译和连接命令,使得编译和连接界面统一。它提供的主要功能有:

<1> 检查库的版本号。如果所需库的版本不满足要求,打印出错误信息,避免连接错误版本的库文件。
<2> 获得编译预处理参数,如宏定义,头文件的路径。
<3> 获得编译参数,如库及其依赖的其他库的位置,文件名及其他一些连接参数。
<4> 自动加入所依赖的其他库的设置。

      在默认情况下,每个支持 pkg-config 的库对应的.pc文件在安装后都位于安装目录中的lib/pkgconfig目录下.新软件一般都会安装.pc文件,没有可以自己创建,并且设置环境变量 PKG_CONFIG_PATH寻找.pc文件路径,否则怎么找得到呢。使用pkg-config工具提取库的编译和连接参数有两个基本的前提:

<1> 库本身在安装的时候必须提供一个相应的.pc文件。不这样做的库说明不支持pkg-config工具的使用。
<2> pkg-config必须知道要到哪里去寻找此.pc 文件。

      3.PKG_CONFIG_PATH.

      上边的第二个基本条件就是设置这个环境变量了。环境变量PKG_CONFIG_PATH是用来设置.pc文件的搜索路径的,pkg-config按照设置路径的先后顺序进行搜索,直到找到指定的.pc 文件为止。这样,库的头文件的搜索路径的设置实际上就变成了对.pc文件搜索路径的设置。在安装完一个需要使用的库后,比如Glib,一是将相应的.pc 文件,如glib-2.0.pc拷贝到/usr/lib/pkgconfig目录下,二是通过设置环境变量PKG_CONFIG_PATH添加glib- 2.0.pc文件的搜索路径。
      这样设置之后,使用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桌面)带来任何冲击。
分享到:
评论

相关推荐

    pkg-config-0.28.tar.gz

    3. **获取链接选项**:`pkg-config --libs libname`可以得到库的链接选项,这些选项会包含库的路径和名称,如`-L/path/to/library -lmylib`。这对于`g++`或`gcc`的链接阶段很有帮助,如`g++ my_program.cpp $(pkg-...

    PCRE-8.37,编译必备神器 解决Consider adjusting the PKG-CONFIG-PATH 必备

    Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables PCRE_CFLAGS and PCRE_LIBS to avoid...

    lua-5.3.tar.gz Mylua-5.3.tar.gz lua生成动态库 lua包管理 pkgconfig PKG_CONFIG_PATH

    总结来说,这个话题涵盖了 Lua 5.3 的核心特性、如何将其编译为动态库、使用 pkg-config 和 lua.pc 文件进行编译配置,以及 Lua 的包管理工具 LuaRocks。如果你打算在你的项目中使用 Lua 或者对其进行扩展,理解这些...

    gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar

    1. 安装依赖:在Ubuntu 18.04上,确保安装了必要的库和工具,如build-essential、pkg-config、binutils-dev等,这些是构建和运行GCC的基础。 2. 解压和配置:解压下载的gcc-linaro-7.5.0-2019.12-x86_64_aarch64-...

    rrdtool的安装

    export PKG_CONFIG_PATH=${INSTALL_DIR}/lib/pkgconfig export PATH=$INSTALL_DIR/bin:$PATH export LDFLAGS="-Wl,--rpath-Wl,${INSTALL_DIR}/lib" ``` 其中 `$INSTALL_DIR` 已经定义为 `/usr/local/rrdtool`。...

    编译qte4.6.3出现的问题解决方法

    这些命令设置了 `TSLIB_ROOT` 来指定TSLIB的安装位置,更新了 `PKG_CONFIG_PATH` 以便pkg-config能找到TSLIB的配置信息,同时更新了 `LD_LIBRARY_PATH` 使得链接器能在运行时找到TSLIB的库文件。 在解决这些问题后...

    openslide-java:Java与OpenSlide的绑定

    )Windows与MinGW-w64的交叉编译 PKG_CONFIG=pkg-config \PKG_CONFIG_PATH=/path/to/cross/compiled/openslide/lib/pkgconfig \./configure --host=i686-w64-mingw32 --build=$(build-aux/config.guess)makemake ...

    MAC OS X 10.11.3替换自带php环境支持GD增加freetype所需要的依赖包

    然后把pkg-config的环境变量:PKG_CONFIG_PATH里增加/usr/local/xxx/lib/pkgconfig 即可。 包内容: inputproto-2.0.1.tar kbproto-1.0.5.tar libgd-2.1.1.tar libpng-1.6.21.tar libpthread-stubs-0.3.tar libX11-...

    linux上安装libpng

    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH ``` 然后再次尝试查找libpng的信息: ``` pkg-config libpng15 --libs --cflags ``` #### 五、小结 通过上述步骤,我们已经成功地在...

    r40_tinav2.1_最终验证通过_使用CB-S来验证SPI2.0成功_20171114_0945没有外层目录.7z

    * Cross-compile with cross-gcc -I/path/to/cross-kernel/include */ #include #include #include #include #include #include #include #include #include #define ARRAY_SIZE(a) (sizeof(a) / ...

    CENTOS8安装SDL2所需文件

    sudo yum install -y gcc autoconf automake libtool pkg-config ``` **步骤3:解压SDL2源码并编译安装** ```bash tar zxf SDL2-2.28.5.tar.gz cd SDL2-2.28.5 ./configure make sudo make install ``` **步骤4:...

    linux下更新GTK+到3.x.docx

    同时,也可以使用`pkg-config`检查GTK+ 3.x的版本和编译链接选项。 6. **处理依赖关系**: 如果有依赖于旧版本GTK+的应用,可能需要更新这些应用以兼容新版本,或者在不破坏现有应用的情况下,确保新旧版本可以...

    gmf:Go Media框架

    export PKG_CONFIG_PATH= $PKG_CONFIG_PATH :/usr/local/ffmpeg/lib/pkgconfig/ 确保PKG_CONFIG_PATH包含ffmpeg的pkgconfig文件夹的路径。 # check it by running pkg-config --libs libavformat 它应打印

    centos7部署tesseract并实现java+tess4j进行图片识别

    如果未安装 pkg-config,则在后续步骤中执行 `./configure` 时可能会遇到错误:“configure: error: Leptonica 1.74 or higher is required. Try to install libleptonica-dev package.” ##### 2.2 编译安装 ...

    libmgi-4.0.0.tar.gz

    ./configure --prefix=$PWD/../_install --host=arm-hisiv600-linux PKG_CONFIG_PATH=$PWD/../_install/lib/pkgconfig/ CPPFLAGS=-I$PWD/../_install/include LDFLAGS=-L$PWD/../_install/lib make make install

    glib库的交叉编译与移植 (2).docx

    通过`pkg-config`命令获取正确的编译和链接选项,确保程序能够找到`glib`库。例如: ```bash pkg-config --cflags --libs glib-2.0 ``` 然后将这些选项添加到你的`gcc`或`g++`编译命令中,完成程序的编译。将编译...

    ap6212a0_a33_sc3817r_服务器验证通过_bt已经通了_wifi需要修改配置_需要再次验证_20170626_1549.7z

    WIFI_DRIVER_FW_PATH_PARAM := "/sys/module/bcmdhd/parameters/firmware_path" #SW_BOARD_USR_WIFI := AP6181 #SW_BOARD_USR_WIFI := AP6210 #WIFI_DRIVER_FW_PATH_STA := "/system/vendor/modules/fw_bcm...

    glib库的交叉编译与移植.docx

    通过运行`pkg-config --cflags libffi-arm`和`pkg-config --libs libffi-arm`,可以获取到编译glib时所需的配置信息。 完成以上步骤后,你应该能在开发板上成功运行使用了glib库的程序。需要注意的是,不同版本的...

    嵌入式海思板交叉编译ffmpeg libx264 和 libx265可以在板子上面跑起来详细步骤记录。

    export PKG_CONFIG_PATH=/home/lulei/work/ffmpeg/lib/pkgconfig ``` 接着执行ffmpeg的配置命令: ``` ./configure --prefix=/home/lulei/work/ffmpeg --cross-prefix=/opt/hisi-linux/x86-arm/arm-himix400-...

    bluez移植到arm-linux上

    2. **环境变量设置**:正确设置 `PKG_CONFIG_PATH` 等环境变量,以确保编译器能够找到正确的库文件和头文件。 3. **依赖关系**:注意各个组件之间的依赖关系,例如 D-Bus 需要 Libxml2 的支持。 4. **内核版本兼容性...

Global site tag (gtag.js) - Google Analytics