• pkgconfig工具的使用


    一、 pkg-config简介

    1、关于pkg-config工具下面这篇博客有个简单的介绍,链接如下:

    理解 pkg-config 工具

    2、pkg-config软件官网:http://www.freedesktop.org/wiki/Software/pkg-config/

     二、最近在看glib、dbus、gtk的一些例子程序,在编译程序时经常找不到头文件和库文件路径。并且使用cmake进行rpm打包和编译时会使用到pkg-config这个实用的工具。

        pkg-config能根据软件安装时软件的.pc配置文件路径找到相应的头文件路径和库文件路径,如我的ubuntu12.04下默认安装glib-2.0后在 /usr/lib/i386-linux-gnu/pkgconfig/

    路径下有glib-2.0.pc,其内容如下:

    prefix=/usr
    exec_prefix=${prefix}
    libdir=${prefix}/lib/i386-linux-gnu
    includedir=${prefix}/include
    
    glib_genmarshal=glib-genmarshal
    gobject_query=gobject-query
    glib_mkenums=glib-mkenums
    
    Name: GLib
    Description: C Utility Library
    Version: 2.32.3
    Requires.private: libpcre
    Libs: -L${libdir} -lglib-2.0 
    Libs.private: -pthread -lrt  -lpcre    
    Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include 

    根据glib-2.0.pc文件的描述我们可以看到使用sudo apt-get install glib-2.0后glib-2.0的各个文件存放路径如下:

    可执行文件安装路径:/usr

    .h头文件安装路径为:/usr/include/glib-2.0和/usr/lib/i386-linux-gnu/glib-2.0/include 

    .so库文件安装路径为:/usr/lib/i386-linux-gnu


    三、在ubuntu12.04下安装好glib-2.0和gtk+-2.0后,下面来看两个例子。

    1、一个使用了glib库的简单程序hello.c,代码如下:

    //hello.c
    #include <glib.h>
    
    int main(int argc, char *argv[])
    {
        g_print("welcome to glib programming world!\n");
    
        return 0;
    }

    打开终端,输入
    gcc -o hello hello.c `pkg-config --cflags --libs glib-2.0`(注意:此处不是单引号,而是键盘左边数字键'1'左侧、Tab键上侧的[`]),千万别弄错哦!)

    ccf@ccf-F81Se:~/WorkPlace/Glib库学习$ gcc -o hello hello.c `pkg-config --cflags --libs glib-2.0`
    ccf@ccf-F81Se:~/WorkPlace/Glib库学习$ ls
    dbus-glib示例说明.ppt  glib-2.34.3-docs    glib-notes.tar.gz    GLIB 库简介  ~  GmainLoop.c~  loop      Thread_Pools_glib.pdf
    Event_loop.html        glib-2.34.3.tar.xz  Glib库的安装和编译?  gmain_demo.c~   hello         loop.c    理解pkg-config工具
    glib-2.34.3            glib-notes          GLIB 库简介          GmainLoop.c     hello.c       makefile  理解pkg-config工具~
    ccf@ccf-F81Se:~/WorkPlace/Glib库学习$ ./hello 
    welcome to glib programming world!
    ccf@ccf-F81Se:~/WorkPlace/Glib库学习$ 
    

    2、一个简单的gtk程序

    /*
    *File name: gtkbase.c
    */
    
    //#include <gtk-2.0/gtk/gtk.h>
    #include <gtk/gtk.h>
    //#include <gtk.h> //使用此路径会编译失败,找不到头文件!
    
    int main(int argc,char* argv[])
    {
        GtkWidget *wnd;
        gtk_init(&argc,&argv);
       
        wnd=gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_widget_show(wnd);
    
        gtk_main();
        return 0;
    }

    在终端编译敲如命令:gcc gtkbase.c -o gtkbase `pkg-config --cflags --libs gtk+-2.0 gthread-2.0`

    ccf@ccf-F81Se:~/WorkPlace/gtk$ ls
    GTK2.0 编译问题    gtkbase.c   makefile    threadloop.c
    GTK2.0 编译问题 ~  gtkbase.c~  threadloop
    ccf@ccf-F81Se:~/WorkPlace/gtk$ gcc gtkbase.c -o gtkbase `pkg-config --cflags --libs gtk+-2.0 gthread-2.0`
    ccf@ccf-F81Se:~/WorkPlace/gtk$ ./gtkbase 


    为了简单起见,可以写一个简单的makefile文件,这样的话每次编译只需改动很少的部分就行了,在终端键入make或make clean就OK了。

    #makefile for gtkbase
    APP_NAME=gtkbase
    CC=gcc
    RM=-rm -f
    LIBS=`pkg-config --cflags --libs gtk+-2.0 gthread-2.0`
    
    $(APP_NAME):$(APP_NAME).c
        gcc $< -o $@ $(LIBS)
    
    .PHNOY:clean
    clean:
        $(RM) *.o $(APP_NAME)


  • 相关阅读:
    git技能
    iOS 命名规则
    iOS crash 报错类型
    iOS 面试相关
    【转】app后端如何选择合适的数据库产品
    App的token机制
    【转】Spring注解详解
    spring mvc ModelAndView 404的原因
    ibatis 环境搭建(1)
    Android中的Selector的用法
  • 原文地址:https://www.cnblogs.com/ccf19881030/p/12004884.html
Copyright © 2020-2023  润新知