关于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文件。

搜索优先级

  1. 如果源文件中使用双引号来包含头文件,则首先在源文件当前目录查找头文件。
  2. 如果编译时使用-I /some/dir,则在/some/dir中查找。
  3. 如果设置了环境变量C_INCLUDE_PATH,则在指定的目录中查找。
  4. 最后在编译器预设的路径中查找,这是不需要指定的,编译时一定会在该路径中搜索所需的头文件。

关于内定目录
内定搜索目录,这是编译器自身预设的目录。由于是内定的,一定会搜索,所以总是最后才搜索。

	/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)

搜素优先级

  1. 如果编译时使用-L /some/lib,则在/some/lib中查找。
  2. gcc的环境变量LIBRARY_PATH(静态库)、LD_LIBRARY_PATH(动态库)。
  3. 再找内定目录/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中库和头文件的搜索路径的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程