概念厘清

本文探讨了在Ubuntu系统中不同版本软件共存时的编译与运行问题,详细介绍了头文件和库文件的搜索顺序,以及如何解决因版本不一致导致的symbol lookup error。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


每一个Ubuntu版本 , 安装软件package时总是有一个默认的软件版本

拿boost 和opencv 来举2个例, :

Ubuntu 14.04 LTS, 软件源中默认对应的boost是1.54.0, opencv 是2.4.8

有时候我们需要装其他版本的软件;

默认的软件安装的路径大致是: 头文件: /usr/inlcude;  库文件: /usr/lib/x86_64-linux-gnu

而自己编译的软件,比如boost 1.60.0和 opencv 3.0.0,  安装路径都是/usr/local,也就是说: /usr/local/include 和 /usr/local/lib

再比如说 opencv 的 pkgconfig/opencv.pc 文件, 2.4.8的是放在 /usr/lib/x86_64-linux-gnu/pkgconfig/opencv.pc , 3.0.0是自己编译的,放在 /usr/local/lib/pkgconfig/opencv.pc 


当存在两个版本的软件时, 这时就应该注意程序的编译和运行问题了

编译时: 注意头文件和库文件的搜索顺序

运行时: 注意库文件的搜索顺序,

更需要注意: 当编译时头文件用的版本和运行时用的库的版本不一致时,就出现 symbol lookup error, 多数情况下这种错误就是这个原因;

所以,不能以为你用ldd看到库引用的版本是正确的就OK,如过编译时头文件版本不对,就会有symbol lookup error;

下面来详细讨论编译和运行时头文件和库的搜索顺序:

 

引用:  http://www.voidcn.com/article/p-audmuddb-bmq.html


 #include “headfile.h”

搜索顺序为:

先搜索当前目录

然后搜索-I指定的目录

再搜索gcc的环境变量CPLUS_INCLUDE_PATHC程序使用的是C_INCLUDE_PATH

最后搜索gcc的内定目录

usr/local/include

/usr/include/x86_64-linux-gnu

/usr/include

 

#include <headfile.h>

先搜索-I指定的目录

然后搜索gcc的环境变量CPLUS_INCLUDE_PATH

最后搜索gcc的内定目录

/usr/local/include

 /usr/include/x86_64-linux-gnu

/usr/include 

也就是说, <> 和 ""的区别在于不搜索 当前目录


这里要特别注意: 在 Ubuntu 14.04上亲测: 内定目录的优先顺序是 /usr/local/include 优先于/usr/include/x86_64-linux-gnu再优先于 /usr/include, 并且不能被-I改变, 也就是说 -I后面跟个内定目录(比如"-I/usr/include")是没有效果的, 

但是在编译的链接阶段,/usr/lib的优先级却又高于/usr/local/lib,并且又通过-L来改变,这真是gcc一个蛋疼的现象;

运行时动态库的搜索路径:

动态库的搜索路径搜索的先后顺序是:

编译目标代码时指定的动态库搜索路径(这是通过gcc 的参数"-Wl,-rpath,"指定。当指定多个动态库搜索路径时,路径之间用冒号""分隔)

环境变量LD_LIBRARY_PATH指定的动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号""分隔)

配置文件/etc/ld.so.conf中指定的动态库搜索路径;

默认的动态库搜索路径/lib

默认的动态库搜索路径/usr/lib

应注意动态库搜寻路径并不包括当前文件夹,所以当即使可执行文件和其所需的so文件在同一文件夹,也会出现找不到so的问题,类同#include <header_file>不搜索当前目录


这里要注意: 第一条, 运行时的搜索路径是可能由编译时候规定好的,如果找不到编译时候规定的,才按照后面的顺序查找; 目前,还没有测试过 /lib, /usr/local/lib, /usr/lib/x86_64-linux-gnu的优先顺序; 遇到的例子中,比如ROS使用的boost 1.54.0的库,都属于1的情况;


Image

Graphic

frame


通常说成品图片的时候都是image,  说Graphic通常意味着在技术层面对image内容的改动或讨论, 而frame等于image+帧号


file

path

directory


path通常值的是全路径的文件或目录, 因为本身目录也是文件;  directory单指目录; file本质上包括目录,但偏向指真正的文件;


为什么加权平均可以抑制噪声?

噪声就是像素的强度相对于真值有个突变。从时域上讲,通过高斯滤波能让一个像素的强度与周围的点相关,就减小了突变的影响;从频域上讲,突变引入了高频分量,而高斯滤波器可以滤除高频分量。


取权重的已知要求:

既然每个点都要取周边像素的平均值,那么应该如何分配权重呢?

如果使用简单平均,显然不是很合理,因为图像都是连续的,越靠近的点关系越密切,越远离的点关系越疏远 (好像只知道这个要求, 又想不出其他约束)。因此,加权平均更合理,距离越近的点权重越大,距离越远的点权重越小。


用正态分布(高斯函数)为邻居分配权重


所以, 正态分布就成了一种可取的权重分配模式。


引用: 正态分布的前世今生

http://www.52nlp.cn/%E6%AD%A3%E6%80%81%E5%88%86%E5%B8%83%E7%9A%84%E5%89%8D%E4%B8%96%E4%BB%8A%E7%94%9F%E4%B8%80



1, 使用 #pragma once 比使用 #ifndef #endif的方式方便


2, 命名:

    比如, image, graphcic, frame, frame是带有帧id属性的


3, 不要取 std::vector 内元素的地址, 很愚蠢;


1,  线性空间,  更直观的叫法是向量空间;


资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 HttpServletRequestWrapper 是 Java Servlet API 中的一个工具类,位于 javax.servlet.http 包中,用于对 HttpServletRequest 对象进行封装,从而在 Web 应用中实现对 HTTP 请求的拦截、修改或增强等功能。通过继承该类并覆盖相关方法,开发者可以轻松地自定义请求处理逻辑,例如修改请求参数、添加请求头、记录日志等。 参数过滤:在请求到达处理器之前,可以对请求参数进行检查或修改,例如去除 URL 编码、过滤敏感信息或进行安全检查。 请求头操作:可以修改或添加请求头,比如设置自定义的 Content-Type 或添加认证信息。 请求属性扩展:在原始请求的基础上添加自定义属性,供后续处理使用。 日志记录:在处理请求前记录请求信息,如 URL、参数、请求头等,便于调试和监控。 跨域支持:通过添加 CORS 相关的响应头,允许来自不同源的请求。 HttpServletRequestWrapper 通过继承 HttpServletRequest 接口并重写其方法来实现功能。开发者可以在重写的方法中添加自定义逻辑,例如在获取参数时进行过滤,或在读取请求体时进行解密。当调用这些方法时,实际上是调用了包装器中的方法,从而实现了对原始请求的修改或增强。 以下是一个简单的示例,展示如何创建一个用于过滤请求参数的包装器: 在 doFilter 方法中,可以使用 CustomRequestWrapper 包装原始请求: 这样,每当调用 getParameterValues 方法时,都会先经过自定义的过滤逻辑。 HttpServletRequestWrapper 是 Java Web 开发中一个强大的工具,它提供了灵活的扩展性,允许开发者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值