关于linux中库和头文件的搜索路径
2021/4/15 7:25:24
本文主要是介绍关于linux中库和头文件的搜索路径,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、关于头文件
#include有两种形式
#include <syshead.h>
#include "userhead.h"
用尖括号表示的是包含系统的头文件,用双引号包含的是用户本身的头文件。
#include时的一些规则:
a. 使用<>
包含的头文件通常会先搜索-I
选项后的路径(即用gcc编译时的-I
选项),以后就是标准的系统头文件路径
。
b. 而用""
号包含的头文件会首先搜索当前的工做目录,以后的搜索路径才是和<>
号包含的头文件所搜索的路径同样的路径。
c. 在unix系统中,通常标准的头文件路径为:
/usr/local/include
/usr/lib/gcc-lib/target/version/include
/usr/target/include
/usr/include
d. 通常有两条独立的头文件搜索路径链。一条是-I后面指示的路径,另外一条是系统头文件路径和以-prefix, -withprefix,和-idirafter后操做的目录。
e. 在头文件中运行增长路径名,例如:#include <sys/time.h>,那么就会在搜索的系统目录的sys目录下寻找time.h文件。
搜索优先级
- 如果源文件中使用双引号来包含头文件,则首先在源文件当前目录查找头文件。
- 如果编译时使用
-I /some/dir
,则在/some/dir
中查找。 - 如果设置了环境变量
C_INCLUDE_PATH
,则在指定的目录中查找。 - 最后在编译器
预设的路径
中查找,这是不需要指定的,编译时一定会在该路径中搜索所需的头文件。
关于内定目录
内定搜索目录,这是编译器自身预设的目录。由于是内定的,一定会搜索,所以总是最后才搜索。
/usr/include /usr/local/include /usr/lib/gcc-lib/i386-linux/2.95.2/include /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3 /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include
库文件可是若是装gcc的时候,是有给定的prefix的话,那么就是
/usr/include prefix/include prefix/xxx-xxx-xxx-gnulibc/include prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include
二、关于库文件
静态库和动态库的基本概念
静态库
,是在可执行程序连接时就已经加入到执行码中,在物理上成为执行程序的一部分;使用静态库编译的程序运行时无需该库文件支持,哪里都可以用,但是生成的可执行文件较大。
动态库
,是在可执行程序启动时加载到执行程序中,可以被多个可执行程序共享使用。使用动态库编译生成的程序相对较小,但运行时需要库文件支持,如果机器里没有这些库文件就不能运行。
如何使用动态库
1、如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置。
2、linux的可执行程序在执行
的时候默认是先搜索/lib
和/usr/lib
这两个目录,然后按照/etc/ld.so.conf
里面的配置搜索绝对路径。
3、同时,Linux也提供了环境变量LD_LIBRARY_PATH
供用户选择使用,用户可以通过设定它来查找除默认路径之外的其他路径,如查找/work/lib路径,你可以在/etc/rc.d/rc.local
或其他系统启动后即可执行到的脚本添加如下语句:LD_LIBRARY_PATH =/work/lib:$(LD_LIBRARY_PATH)
。
搜素优先级
- 如果编译时使用
-L /some/lib
,则在/some/lib
中查找。 - gcc的环境变量
LIBRARY_PATH
(静态库)、LD_LIBRARY_PATH
(动态库)。 - 再找内定目录
/lib:/usr/lib:/usr/local/lib
这是当初编译gcc时写在程序内的。
三、配置头文件和库文件、可执行文件环境变量
1、命令行临时配置 (关闭终端后就失效)
export PATH=/usr/local/mybin:$PATH
可执行文件配置
export C_INCLUDE_PATH=/usr/local/myinclude:$C_INCLUDE_PATH
头文件配置
export LIBRARY_PATH=/usr/local/mylib:$LIBRARY_PATH
库文件配置
export LD_LIBRARY_PATH=/usr/local/mylib:$LIBRARY_PATH
动态库文件配置
2、永久配置
export PATH=/usr/local/mybin:$PATH
可执行文件配置
export C_INCLUDE_PATH=/usr/local/myinclude:$C_INCLUDE_PATH
头文件配置
export LIBRARY_PATH=/usr/local/mylib:$LIBRARY_PATH
静态库文件配置
export LD_LIBRARY_PATH=/usr/local/mylib:$LD_LIBRARY_PATH
动态库文件配置
:
冒号表示指定多个不同的路径
将以上配置写入以下两个级别的文件夹里即可完成配置
配置完成之后例如运行source /etc/profile
使其配置生效,或者重启
- 系统级
(1)
/etc/profile
:该文件是用户登录时,操作系统定制用户环境时使用的第一个文件,应用于登录到系统的每一个用户。该文件一般是调用/etc/bash.bashrc文件。/etc/bash.bashrc:系统级的bashrc文件。
(2)/etc/environment
:在登录时操作系统使用的第二个文件,系统在读取你自己的profile前,设置环境文件的环境变量。
- 用户级(这些文件位于家目录下)
(1)
~/.profile
:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次! 默认情况下,他设置一些环境变量,执行用户的.bashrc文件。这里是推荐放置个人设置的地方
(2)~/.bashrc
:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。不推荐放到这儿,因为每开一个shell,这个文件会读取一次,效率肯定有影响。
关于 Why LD_LIBRARY_PATH is bad 请参考http://www.voidcn.com/article/p-ayjwaghe-za.html
这篇关于关于linux中库和头文件的搜索路径的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23linux 系统宝塔查看网站访问的命令是什么?-icode9专业技术文章分享
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南