日常知识点之编译运行时识别头文件目录或者链接库目录设置

简介: 日常知识点之编译运行时识别头文件目录或者链接库目录设置

最近在日常工作中,用自己的业务结合ZLMediakit的开源库做一些业务处理时,涉及到一些头文件和so链接的细节技巧,做汇总,以方便后面回顾。

使用gcc/g++编译的时候,其实都已经有一系列默认的路径,在这些路径中去依次查找依赖的头文件,动态库等。

我们需要使用的第三方的头文件和so,那么就有如下几种方案。

0:在使用gcc编译的时候,直接使用-I 和-L紧跟链接路径。

1:把这些头文件和so拷贝到操作系统特定的目录,或者代码的同级目录。 ==》这个不做讨论

2:使用export设置相关的环境变量,使能识别到特定的目录。 ===》 只在当前终端生效

这里要注意 gcc/g++都有特定的环境变量名称,尤其是头文件目录的设置。

3:修改/etc/profile 或者每个用户工作目录下~/.bashrc文件。 ===》永久生效

4:/etc/ld.so.conf 也可以配置动态搜索库路径 。

刚好有这方面的业务,就把这方面的知识整理一下。

这里涉及几个路径相关(编译时头文件的搜索路径,编译时链接库的搜索路径,运行时链接库的搜索路径)

1:编译时直接带参数进行指定。

通过-I指定要依赖的头文件的目录,根据-L指定依赖的链接库的路径。

gcc server.c -o server -I/home/hlp/ZLMediaKit/api/include -lmk_api -L/home/hlp/ZLMediaKit/release/linux/Debug

2:拷贝到系统环境特定目录或者当前目录下

这个把头文件内容和依赖的链接库直接拷贝到当前目录下进行测试即可。

把库拷贝到/usr/lib和/lib目录下。 然后运行ldconfig。

修改/etc/ld.so.conf文件,把库所在的路径加到文件末尾,并执行ldconfig刷新。这样,加入的目录下的所有库文件都可见。

3:通过export设置当前终端的环境变量,使编译和运行可以依赖。

注意:临时有效,当前终端生效,重启后失效。

这里要注意gcc和g++设置头文件的方式:

3.1:注意头文件的依赖C_INCLUDE_PATH 和CPLUS_INCLUDE_PATH

#可以用echo $PATH 查看相关环境变量信息   
#g++ 头文件 环境变量用  C_INCLUDE_PATH    用:进行分割的 后面是跟着原来的变量参数
export C_INCLUDE_PATH=/home/hlp/ZLMediaKit/api/include:$C_INCLUDE_PATH
#g++ 头文件 环境变量用  CPLUS_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/home/hlp/ZLMediaKit/api/include:$CPLUS_INCLUDE_PATH
#设置当前用户的化可以把/home/hlp 改成$HOME

3.2:编译时链接库的依赖路径设置

#貌似时编译的时候需要在这个路径下进行查找的
export LIBRARY_PATH=/home/hlp/ZLMediaKit/release/linux/Debug:$LIBRARY_PATH
#在运行的时候需要在这个路径下进行查找的
export LD_LIBRARY_PATH=/home/hlp/ZLMediaKit/release/linux/Debug:$LD_LIBRARY_PATH

3.3:汇总

我们在写代码时,无非两个概念:

===》第一:编译的时候依赖头文件的目录,需要依赖的相关so,以及这些so的路径。 (可以通过带参数解决,这里通过设置特定环境变量(C_INCLUDE_PATH,CPLUS_INCLUDE_PATH, LIBRARY_PATH)解决)

===》第二:运行的时候,操作系统如何找到动态链接的so呢? (通过设置特定环境变量(LD_LIBRARY_PATH)解决)

4:永久生效环境变量设置方式

所有用户有效在/etc/profile增加以下内容。只对当前用户有效在Home目录下的.bashrc或.bash_profile里增加下面的内容

#增加相关的依赖
#设置PATH 使可执行文件在所有目录下能找到
export PATH =$PATH:$HOME/test/exec
#设置gcc头文件依赖目录   注意这里$HOME的使用,如果切换其他用户还能用吗?
export C_INCLUDE_PATH=$HOME/ZLMediaKit/api/include:$C_INCLUDE_PATH
#设置g++头文件依赖目录
export CPLUS_INCLUDE_PATH=$HOME/ZLMediaKit/api/include:$CPLUS_INCLUDE_PATH
#设置所谓的静态库路径 但是我发现gcc编译时会去这个路径下找so  ==>可以用ldd查看链接依赖情况
export LIBRARY_PATH=/home/hlp/ZLMediaKit/release/linux/Debug:$LIBRARY_PATH
#ldd server   可以查看当前链接库路径是否能识别到
#设置使运行时能识别到链接so   执行编译后的可执行文件时,能找到依赖的相关库
export LD_LIBRARY_PATH=/home/hlp/ZLMediaKit/release/linux/Debug:$LD_LIBRARY_PATH

在对应的文件中新增这些路径后,并不会真正的生效,需要更新一下。

#这里执行刚才修改的文件就好
source /etc/profile
source ~/.bashrc

可以直接测试,依赖so而不需要设置目录

目录
相关文章
|
安全 调度 数据安全/隐私保护
PCIe访问控制服务(ACS)
PCIe访问控制服务(ACS)
7494 0
PCIe访问控制服务(ACS)
|
Web App开发 JSON API
携程网地方美食品列表数据接口(携程 API 系列)
携程网作为国内领先的在线旅游服务平台,整合了丰富的美食资源。通过其地方美食品列表数据接口(假设存在),开发者可获取各地特色美食信息,如名称、菜系、评分等,并按价格、热门程度筛选。接口返回 JSON 格式数据,支持地区和筛选参数设置,且有调用频率限制。示例代码展示了如何使用 Python 的 requests 库发送请求并处理响应,模拟查询北京地区的美食。实际接口需替换为真实 URL。
|
12月前
|
Ubuntu 数据可视化 开发工具
【VTK】ubuntu手动编译VTK9.3 Generating qmltypes file 失败
通过以上步骤,您可以成功解决在Ubuntu上编译VTK 9.3时遇到的 `Generating qmltypes file`失败的问题。关键在于确保系统正确安装了所需的Qt库,并通过CMake配置正确的路径。编译完成后,您将拥有一个功能完备的VTK库,可以用于各种可视化任务。
335 14
|
JSON API 开发者
ebay 商品列表数据接口(ebay API 系列)
eBay 商品列表数据接口为电商从业者、开发者和研究人员提供了宝贵的数据资源,助力市场分析与应用开发。通过注册 eBay 开发者平台并遵循 OAuth 2.0 认证流程获取访问令牌,用户可以使用 HTTP GET 请求调用 API,根据关键词、价格范围等参数筛选商品,并获取商品标题、价格、图片链接等信息。Python 示例代码展示了如何发送请求、处理响应并解析 JSON 数据,帮助用户快速上手。注意合法合规使用数据。
621 14
|
弹性计算 负载均衡 安全
无影云桌面和云服务器有什么区别?
无影云桌面和云服务器有什么区别?阿里云无影云电脑和云服务器有什么区别?云电脑是作为个人或企业办公电脑使用,云服务器是对外提供24小时高可用服务,云电脑是桌面服务,云服务器是提供背后的计算服务,阿里云百科分享阿里云无影云电脑和云服务器的区别
481 0
|
机器学习/深度学习 数据采集 算法
探索Python科学计算的边界:NumPy、Pandas与SciPy在大规模数据分析中的高级应用
【10月更文挑战第5天】随着数据科学和机器学习领域的快速发展,处理大规模数据集的能力变得至关重要。Python凭借其强大的生态系统,尤其是NumPy、Pandas和SciPy等库的支持,在这个领域占据了重要地位。本文将深入探讨这些库如何帮助科学家和工程师高效地进行数据分析,并通过实际案例来展示它们的一些高级应用。
473 0
探索Python科学计算的边界:NumPy、Pandas与SciPy在大规模数据分析中的高级应用
|
自然语言处理 Linux 芯片
实践经验分享:以太网MAC和PHY层问题的解决方案
实践经验分享:以太网MAC和PHY层问题的解决方案
|
JavaScript 前端开发 API
Vue 3+TypeScript项目实战:解锁vue-next-admin中的全局挂载对象接口,让跨组件共享变得高效而优雅!
【8月更文挑战第3天】在构建Vue 3与TypeScript及vue-next-admin框架的应用时,为提高多组件间共享数据或方法的效率和可维护性,全局挂载对象接口成为关键。本文通过问答形式介绍其必要性和实现方法:首先定义全局接口及其实现,如日期格式化工具;接着在`main.ts`中通过`app.config.globalProperties`将其挂载;最后在组件内通过Composition API的`getCurrentInstance`访问。这种方式简化了跨组件通信,增强了代码复用性和维护性。
279 0
|
存储 API C语言
C语言Log工具推荐-easylogger
C语言Log工具推荐-easylogger
581 1
|
Ubuntu Linux 编译器
通过qemu和docker搭建交叉编译环境
通过qemu和docker搭建交叉编译环境