在如今这个开源的环境里,想要开发某个功能,我们都会下意识的上网搜索有没有开源库,如果有开源库,那么好,下载下来给它编译好,使用。但是在使用过程中,你是否遇到不知如何将第三方库编译,链接到自己的工程中?怎么改makefile就是改不好?是否看到开源库lib/中pkgconfig文件夹,想都没想这是干什么用的,打开.pc文件也不知所云?那么好,今天我就总结下开源库中pkgconfig文件夹中.pc文件的作用,以及如何用pkg-config工具将开源库集成到自己的工程中去。

1、pkg-config工具的作用

    pkg-config简单的说就是向用户提供相应库的路径,版本号,头文件路径等信息的综合调用程序。笔者使用的是Ubuntu系统,我们以OpenEXR库为例看看pkg-config运行的结果,在shell命令行输入:
显示信息为:-I/usr/include/OpenEXR -lIlmImf -lImath -lHalf -lIex -lIexMath -lIlmThread -lpthread
这是什么呀?
-I/usr/include/OpenEXR 这不就是我们用gcc编译时的CFLAGS参数吗?
-lIlmImf -lImath -lHalf -lIex -lIexMath -lIlmThread -lpthread这些不就是gcc在链接时使用的LDFLAGS参数吗?
因此当我们需要在自己的工程中编译链接时只需要合理的使用pkg-config工具,把上面那些参数加入到gcc的参数里即可,这个就是pkg-config工具的核心作用,它会检查你的库,产生相应信息,为你集成某个第三方库提供便利。
2、*.pc文件解析
    我们知道,第三方库的使用主要涉及头文件的路径设置,库的路径设置以及动态库的环境变量设置。一般来讲,第三方库都会提供一个*.pc 文件,pkg-config程序通过读取这个*.pc的文件,获取了库的头文件位置和库的路径等信息,然后告知编译器,实现库的自动使用。一般来说,*.pc文件的大体内容如下格式(以笔者最近使用的SQLite3为例):

其中,

  • prefix一般是指定库的默认安装路径
  • exec_prefix一般是指库的另外指定的安装路径
  • inludedir指定库的头文件路径
  • libdir指定库的lib文件的路径
  • Name指定库的名称,比如笔者使用的SQLite数据库
  • Description表示库的描述
  • Version是版本号
  • Cflags是gcc链接头文件的指令,以-I紧接头文件路径设置
  • Libs是gcc链接lib文件的指令, 是-L紧接lib文件路径,-l紧接所使用的lib的名字。
3、如何编译链接到你的工程?
    这里讲的是工程,我只讲干货,编译单个程序例子网上有很多,就不赘述了。这里注意,使用pkg-config工具提取库的编译和链接参数需要有两个基本前提:
1)库本身按章的时候必须提供一个.pc文件。没有这个文件的说明库不支持pkg-config工具;
2)pkg-config必须要知道去哪找.pc文件;
 
    对于支持pkg-config工具的库来说,库文件的搜索路径实际就是对.pc文件的搜索路径,一般系统的默认搜索路在/usr/lib/pkgconfig 中,库的头文件一般在/usr/include中。而个人使用的第三方库,不能每次编译后都装到/usr目录下吧。所以私有工程在编译链接第三方库时可以通过环境变量PKG_CONFIG_PATH来设置,pkg-config工具将按照设置路径的先后顺序进行搜索,直到找到指定的.pc文件为止。
   所以在私有工程的makefile中,先修改环境变量:
export PKG_CONFIG_PATH=/home/水笙/sqlite-autoconf-3130000/build_result/lib/pkgconfig:$PKG_CONFIG_PATH
环境变量设置好后,设置CFLAGS:
CFLAGS += `pkg-config --cflags sqlite3`
这里注意要用``将命令包起来。
然后设置LDFLAGS:
LDFLAGS += `pkg-config --libs sqlite3`
基本通过这三步,工程就可以正确的编译链接第三方库了。
4、运行时指明共享库搜索路径
    我们知道,库分为静态库和共享库。静态库.a就是一些.o文件的集合,编译链接后就集成到了你的应用程序中。而共享库,是在程序运行的时才被使用的,其搜索路径是在系统中预先设置的,对于处于搜索路劲之外的库,使用的时候必须设置好环境变量LD_LIBRARY_PATH,否则应用程序找不到,笔者将sqlite3库放到了应用程序文件夹的./lib中,在启动应用前调用下面这句:
export LD_LIBRARY_PATH="./lib"
笔者建议,最好将其写在你的启动脚本里。

pkg-config工具在实际工程中的用法相关推荐

  1. linux双机脚本pkg如何生效,linux里命令pkg config工具的使用

    一.编译和连接 一般来说,如果库的头文件不在 /usr/include 目录中,那么在编译的时候需要用 -I 参数指定其路径.由于同一个库在不同系统上可能位于不同的目录下,用户安装库的时候也可以将库安 ...

  2. HarmonyOS之在工程中导入Sample工程和添加Module

    一.导入 Sample 工程 ① Sample 说明 DevEco Studio 支持 HarmonyOS Sample 工程的导入功能,通过对接 Gitee 开源社区中的 Sample 资源,可一键 ...

  3. Instagram个性化推荐工程中三个关键技术是什么?

    作者 | Ivan Medvedev,Haotian Wu,Taylor Gordon 译者 | 陆离 编辑 | Jane 出品 | AI科技大本营(ID:rgznai100) [导语]近期,Face ...

  4. phonegap工程中修改app的名字

    针对phonegap比较高的版本,我的是6.4.0. 在phonegap工程中,当添加了iOS和android平台或多个平台后,工程进行了开发,然后觉得app的名字想修改一下(比如在手机上显示的app ...

  5. 机器学习-特征工程中的特征降维

    对于一个机器学习问题,数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限.由此可见,数据和特征在模型的整个开发过程中是比较重要.特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为 ...

  6. 机器学习-特征工程中的特征选择

    对于一个机器学习问题,数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限.由此可见,数据和特征在模型的整个开发过程中是比较重要.特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为 ...

  7. matlab计算海洋浮力频率_水下机器人在海洋石油工程中的应用

    世界海洋总面积约为3.6×108平方千米,占地球总面积的70.8%,在广阔的海洋中,蕴含着非常丰富的生物资源.矿物资源和海洋能源.其中最具经济开采价值的是海底的石油和天然气资源,海洋石油资源储量占世界 ...

  8. 使计算机工作必不可缺的软件,探讨测绘工程中计算机制图的运用问题(原稿)

    1.样,对图纸审核工作的开展十分不利.利用CAD软件可以使图形标准工作更加方便地开展,另外还可以在非常多的地共享时也会由于这部分问题导致出现问题,进而增加工作量.探讨测绘工程中计算机制图的运用问题(原 ...

  9. 开发工程中遇到的BUG

    Xcode7自带Git创建的项目"Couldn't communicate with a helper application" git xcode7 zhunjiee 2015年 ...

最新文章

  1. DNS--3--Master DNS架设
  2. 你用过这种奇葩的C#注释吗?如何看待
  3. advanced installer重新打包教程
  4. 全屏显示的包含webview的页面中弹出的软键盘覆盖输入框的问题
  5. RocketMQ消息重试机制
  6. 令人难忘的初吻描写......
  7. 华为云GaussDB专家走进课堂,跟莘莘学子聊聊数据库
  8. C语言在linux终端下实现2048小游戏:第二版
  9. cout不明确什么意思_王源吸烟粉丝说不袒护,让他谨慎交友是什么意思?
  10. 设置橘子浏览器的newtab页面
  11. hdu 4717 The Moving Points(三分)
  12. 【存档】20个正则表达式
  13. WWDC2019最值得看的十个视频
  14. “互联网+”服务产业现状和个人信息保护特征分析
  15. 动作捕捉用于蛇运动分析及蛇形机器人开发
  16. python程序员真实收入曝光_行!看到抖音上Python程序员晒得工资条,我沉默了.........
  17. 学术研究入门,如何下载论文?
  18. 关于英伟达jetson nano的搭配双目摄像头跑ORB_SLAM2
  19. java正则包含特殊字符_java – 捕获由特殊字符嵌套/包含的正则表达式组
  20. UE4 Socket多线程非阻塞通信【2】

热门文章

  1. python导入类有红线_python踩坑系列之导入包时下划红线及报错“No module named”问题...
  2. 数字图像处理:blob分析、阈值分割
  3. 【机器视觉案例】(13) 脸部和摄像机间的距离测量,自适应文本大小,附python完整代码
  4. 【机器学习入门】(7) 线性回归算法:原理、公式推导、损失函数、似然函数、梯度下降
  5. 【禅模式】如何进入极度专注的心流状态,让前端开发能力发挥到最大?设置VSCode禅模式快捷键Alt+F切换全屏,适合演示代码使用
  6. Vue项目中使用wangEditor富文本输入框(推荐)
  7. coreseek最大检索数只有1000的问题!
  8. vim学习笔记(三)
  9. C语言的单链表逆序和指定范围逆序
  10. linux命令 iperf-网络性能测试工具