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

技术
下载桌面版
GitHub
百度网盘(提取码:draw)
Gitee
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:766591547
关注微信