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

2023-05-16

最近在日常工作中,用自己的业务结合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而不需要设置目录

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Radon变换理论介绍

    本人最近在研究Radon变换 xff0c 在查阅了各种资料之后在此写下个人的理解 xff0c 希望与各位牛牛进行交流共同进步 xff0c 也使得理解更加深刻些 Radon变换的本质是将原来的函数做了一个空间转换 xff0c 即 xff0c
  • test

    lt DOCTYPE html gt lt html lang 61 34 en 34 gt lt head gt lt meta charset 61 34 utf 8 34 gt lt meta http equiv 61 34 X U
  • BIT内存顺序

    机器的最小寻址单位是字节 xff0c bit无法寻址 xff0c 也就没有高低地址和起始地址的概念 xff0c 我们需要定义一下bit的 地址 以一个字节为例 xff0c 我们把从左到右的8个bit的位置 position 命名按顺序命名如
  • 无人驾驶感知篇之融合(五)

    今天早上看到上海新增一万七千左右 xff0c 看的真的很揪心 xff01 希望白衣战士能早点战胜这场疫情 xff0c 期待明天能有好消息 xff01 今天具体讲讲多贝叶斯估计算法的原理 xff0c 多贝叶斯估计法的主要思想是将传感器信息依据
  • MAC地址的介绍(单播、广播、组播、数据收发)

    MAC地址组成 网络设备的MAC地址是全球唯一的 MAC地址长度为48比特 xff0c 通常用十六进制表示 MAC地址包含两部分 xff1a 前24比特是组织唯一标识符 xff08 OUI xff0c OrganizationallyUni
  • stm32通用定时器输出PWM控制舵机

    stm32的通用定时器有TIM2 TIM3 TIM4 TIM5 xff0c 每个定时器都有独立的四个通道可以作为 xff1a 输入捕获 输出比较 PWM输出 单脉冲模式输出等 stm32除了基本定时器 xff0c 其他定时器都能输出PWM
  • Linux内核Socket CAN中文文档

    自己在年假中空闲之余翻译的内核中Socket CAN的文档 xff0c 原文地址在 xff1a http lxr linux no linux 43 v2 6 34 Documentation networking can txt 但是这篇
  • c/c++自定义通讯协议(TCP/UDP)

    前言 xff1a TCP与UDP是大家耳熟能详的两种传输层通信协议 xff0c 本质区别在于传输控制策略不相同 xff1a 使用TCP协议 xff0c 可以保证传输层数据包能够有序地被接受方接收到 xff0c 依赖其内部一系列复杂的机制 x
  • ubuntu 使用虚拟can 与 socketCAN使用

    原文链接 xff1a https blog csdn net xiandang8023 article details 127990159 创建虚拟CAN接口 在Linux上能使用虚拟CAN接口之前 xff0c 需要在终端执行以下三个步骤
  • cmake引入第三方库

    cmake引入第三方库 第三方库包含 lib文件和 h hpp文件动态库还包含 dll文件 小例程 3rdparty bin test dll include test hpp lib Debug test lib Release test
  • AHB-APB总线协议

    AHB APB总线协议 文章目录 AHB APB总线协议一 AHB APB总线介绍二 AHB总线设备1 AHB主设备 xff08 master xff09 2 AHB从设备 xff08 slave xff09 3 AHB仲裁器 xff08
  • Modelsim缺失库快速添加

    Modelsim缺失库快速添加 文章目录 Modelsim缺失库快速添加前言一 ini文件二 器件库配置1 将器件库放在modelsim文件夹下2 ini配置文件修改 前言 在单独使用modelsim时 xff0c 假如要编译复杂的工程文件
  • AHB-APB_Lite总线协议及Verilog实现

    AHB APB Lite总线协议及Verilog实现 文章目录 AHB APB Lite总线协议及Verilog实现一 AHB Lite协议介绍二 系统框架介绍三 代码设计四 仿真测试 一 AHB Lite协议介绍 AHB xff08 Ad
  • 通信协议详解(二):IIC总线协议(传输时序+数据格式+设计实现)

    文章目录 一 IIC xff08 Inter Integrated Circuit xff09 介绍二 传输协议1 时序传输时序写操作时序数据有效性开始 amp 结束信号从机应答信号 2 数据格式 三 设计实现1 时钟2 传输过程3 三态门
  • Qt error ------ 'XXX' has not been declared

    1 头文件没加 2 调用函数者的头文件在XXX头文件的下方 转载于 https www cnblogs com god of death p 8572306 html
  • Command Expert安装

    一 安装准备 需先下载两个安装包 1 Commmand Expert安装包 https www keysight com cn zh lib software detail computer software command expert
  • Vitis开发(一):Vivado启动vitis

    Vitis是Xilinx SDK的继承开发工具 xff0c 从Vivado 2019 2版本开始启用 在Vivado 2019 1及更早版本中 xff0c 导出的硬件描述文件为 hdf文件 xff0c 给xilinx sdk使用 在Viva
  • 数字IC刷题(一)

    一 选择 1 To achieve better leakage cells are placed A HVT B LVT C RVT 解 LVT Low V threshold xff1a 低阈值 这种库的漏电流较大 xff0c 但是延迟
  • CPU设计-分支预测

    目录 CPU分支指令类型分类 1 xff09 无条件跳转 xff0f 分支 xff08 Unconditional Jump Branch xff09 指令 无条件直接跳转 xff0f 分支 xff1a 无条件间接跳转 xff0f 分支 x

随机推荐