Makefile/CMake加入pkg-config,但是(非系统位置)非root?

1 CMake的pkg-config导入

CMake的pkg-config导入详见:
https://blog.csdn.net/weixin_39956356/article/details/102643415

2 root与否对pkg-config的影响

下面需要讨论两种情况:
(1):你的OpenCV安装在默认位置(/usr/local)?还是自定义的位置?
(2):你是root执行的make?还是普通用户?
首先我们先看一个案例:

我的OpenCV安装在/home/topeet/programfile/opencv2,明显非默认安装。
列出一层目录: tree -L 1 -F
.
├── bin/
├── include/
├── lib/
└── share/

1: 非root情况下执行 -- pkg-config --list-all | grep opencv
		结果为空,
2: root情况下执行 --   pkg-config --list-all | grep opencv
		opencv                         OpenCV - Open Source Computer Vision Library
结论:
需要注意的是:不管你是不是root,pkg-config都会搜索/usr/lib和/usr/local/lib下所有.pc文件,所以并不是非root执行pkg-config就啥都没有。换句话说/usr/lib和/usr/local/lib下所有.pc文件,root与否pkg-config都能找到。
1: 很明显非root条件下,pkg-config找不到opencv.pc,所以仅这样处理的CMake/Makefile,直接报错!
2: 那么root可以直接搜索到/home/topeet/programfile/opencv2/lib/pkg-config/opencv.pc,说明了什么?它能搜索到非root下的opencv.pc。故如果你是root你不用担心pkg-config找不到你需要的.pc文件
3: 对于非root情况下,看似有点糟糕,但是PKG_CONFIG_PATH就能帮助非root用户了。很明显,你怎么能获得root?root就一个啊,所以讨论这个问题很有必要。

3 Makefile的pkg-config导入,也就是传PKG_CONFIG_PATH

经过上面的分析,我们知道了非root要想在CMake/Makefile中导入pkg-config,必须用PKG_CONFIG_PATH传你的.pc文件在哪?

3.1 Makefile环境变量的问题

为什么讲这?
一条基本的常识:

默认情况下,传递顺序(你不做覆盖的情况下):
操作系统的环境变量--->shell(终端)--->根Makefile--->子Makefile
1: 明显,你另起一个终端,其他的终端设置的环境变量是不会传过来的,不同的终端彼此隔离,都继承操作系统的环境变量
2: 马上会有一个想法,我在终端设置opencv.pc文件的路径,再make,就可以啦,是的,根/子Makefile都会知道你的opencv.pc文件的路径
3: 如果我不在终端设置opencv.pc文件的路径呢?我就是想在CMake/Makefile文件弄呢?下面是源码。

3.2 非终端式解决

下面我们任需要注意的是:
在Makefile引入shell命令,该命令执行完该shell就over了,所以export PKG_CONFIG_PATH=/home/topeet/programfile/opencv2/lib/pkgconfig写了两遍,每个shell是独立的,上面讲了,OpenCV_INC 获取OpenCV头文件路径,OpenCV_LIBS 获取OpenCV链接路径

OpenCV_INC = $(shell export PKG_CONFIG_PATH=/home/topeet/programfile/opencv2/lib/pkgconfig; pkg-config opencv --cflags)
CXXFLAGS += $(OpenCV_INC)
OpenCV_LIBS = $(shell export PKG_CONFIG_PATH=/home/topeet/programfile/opencv2/lib/pkgconfig; pkg-config opencv --libs)
LDFLAGS += ${OpenCV_LIBS}

source : 
        $(CXX) ${CXXFLAGS} -o source source.cpp ${LDFLAGS}

.PHONY : clean
clean : 
        -rm -f source

4 编译成功

在这里插入图片描述下面是为没有添加的情况,出错:

在这里插入图片描述

5 CMake又应该怎么应对呢?

CMake相对简单,用SET命令添加PKG_CONFIG_PATH即可

SET(ENV{PKG_CONFIG_PATH} /home/topeet/programfile/opencv2/lib/pkgconfig)

非root的cmake …
在这里插入图片描述

源代码详见:
https://blog.csdn.net/weixin_39956356/article/details/102643415
链接: https://pan.baidu.com/s/1JMPyU0Jf-itd69lU0dlGxg 提取码: tebs

如果有纰漏的地方,请直接指出!!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值