`

环境变量,include搜索路径,lib库搜索路径

 
阅读更多

http://blog.sina.com.cn/s/blog_93b45b0f01011nrz.html

环境变量

 

系统环境变量

 

我们知道,我们经常要设置一些环境变量,系统环境变量我们非常容易理解。其实我们在windows中经常容易接触。其实环境变量是一个非常广泛的一个概念,它与web应用程序中的web.config所处的角色很像。什么意思呢?就是说,程序(系统或应用)要运行的时候,它的基本业务逻辑可能是一定的,但是实现业务逻辑的时候有些设置性的东西却可以改变程序很多。如web应用程序,编译之后他的业务逻辑基本不会发生改变,但是如果你更改一些web.config中的参数,程序的运行就会发生相应的改变。这些设置。就像电视机上面调制一样。改变了设置会得到某些不同。

那么环境变量可以理解成设置的一种,为什么有不直接称为设置呢?因为它处于一种被动的境地。越多说越糊涂。

最常见的环境变量莫过于PATH,和ClassPATH,这个在设置jdk的时候就需要设置,这里的PATH变量指的是,当系统的接口接收到一个程序启动命令的时候,除了默认在当前目录下寻找那个可执行文件意外,还需要到那些地方寻找。有了这个设置,你就不需要一定要进入那个目录才能执行那个程序了。ClassPATH变量也差不多,它设置的是那些类似于动态库的路径,也就是说,程序在执行的时候,发现要引入动态库,那样就要在这个变量指定的地方去找。

在linux中,系统也有一个PATH变量。其实系统有一个文件是专门记录那些环境变量的。

1)/etc/profile,系统登录会执行这个文件在当前环境中引入那些变量。

2)还有  /home/ali/.bashrc 这个文件,简单的来说,/etc/profile是对全局有效的,而./bashrc是对当前用户有效.

3)还有一种设置方法,就是通过终端命令直接修改,我们知道前面两个文件其作用的方式就是当程序进入状态的时候,他们会被执行引入到当前空间,那么在当前状态下就会有这些变量,程序也就是可以使用它们。那么如果我们直接在内存中修改该他们,就可以起到暂时的作用。

 

程序环境变量

 

根据前面我们说过环境变量的作用和意义,就很容易推出,普通的程序也可以有环境变量。按照前面系统的环境变量起作用的模式。应用程序,也可以有一些配置文件来持久保存这些环境变量,在程序执行的时候,这些变量会通过某种方式进入程序执行的空间,这样程序执行的时候就可以使用这些变量了。而同样,我们可以改变这些变量来“适量”的改变我们的程序。

GCC就是这样一个程序。很多时候,应用程序需不需要环境变量机制,关键看他是否有很多的选择性,GCC就是一个这样的程序。

最常用GCC环境变量的就是include搜索路径,以及库搜索路径。他们分别在编译和连接的时候使用。

他们的使用背景是:

 

include搜索路径

 

通常,使用C/C++进行开发程序的时候,会使用头文件,并且有头文件的实现文件,这个时候有三类文件,使用头文件的源文件,头文件,实现头文件的源文件。编译的时候,头文件和源文件一起就可以了。通常他们是在同一目录下的。所以不会有什么问题。

但是,当你使用到了系统自身的一些头文件的时候,你需要引入一些头文件,而这些文件不在当前目录下,使用绝对地址是一个办法,但是是一个极差的办法。所以GCC就有一个搜索机制。就是在规定的那些文件夹下,搜索你所引入的那个头文件。这样解决了问题。这个环境变量叫着CPLUS_INCLUDE_PATH。属于GCC,与系统无关。我们看看GCC头文件搜索路径

 

头文件:

1.       #include “headfile.h”

搜索顺序为:

先搜索当前目录

然后搜索-I指定的目录

再搜索gcc的环境变量CPLUS_INCLUDE_PATHC序使用的是C_INCLUDE_PATH

最后搜索gcc的内定目录

/usr/include

/usr/local/include

/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include

 

各目录存在相同文件时,先找到哪个使用哪个。

2.       #include <headfile.h>

先搜索-I指定的目录

然后搜索gcc的环境变量CPLUS_INCLUDE_PATH

最后搜索gcc的内定目录

/usr/include

/usr/local/include

/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include

 

与上面的相同,各目录存在相同文件时,先找到哪个使用哪个。这里要注意,#include<>方式不会搜索当前目录!

 

虽然搜索了GCC自定义的环境变量目录之后,下一个的内定目录,就应该是操作系统有关这种头文件的定义。这种推导很正确。事实上就算不是这样的。GCC头文件搜索模式,也是按照先“专”后“宽”的模式,也就是说,大部分都是使用自己的一套,所以基本都能找到,可能真有一些是那些大家共有的头文件。所以,这里的内定目录其实与继承操作系统的目录的意思没有多大区别。

 

这里要说下include的内定目录,它不是由$PATH环境变量指定的,而是由g++的配置prefix指定的(知道它在安装g++时可以指定,不知安装后如何修改的,可能是修改配置文件,需要时再研究下)

-bash-3.2$ g++ -v

Using built-in specs.

Target: x86_64-redhat-linux

Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=x86_64-redhat-linux

Thread model: posix

gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)

 

在安装g++时,指定了prefix,那么内定搜索目录就是:

Prefix/include

Prefix/local/include

Prefix/lib/gcc/--host/--version/include

编译时可以通过-nostdinc++选项屏蔽对内定目录搜索头文件。

 

 

库搜索路径:

 

在编译之后,程序要进行链接操作,前面指出,链接不管是动态和是静态,GCC这个程序,必须确认“真的有”那些头文件的实现。于是就需要定位找到那些文件。与include的情景差不多。使用绝对目录是可以的,但不适于管理。于是就出现了lib搜索路径这个环境变量。LIBRARY_PATH。

他们的搜索路径为:

库文件:

编译的时候:

gcc会去找-L

再找gcc的环境变量LIBRARY_PATH

再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的(不可配置的?)

 

运行时动态库的搜索路径

(不要把这个和库的搜索路径混淆了,这里程序执行的时候有linux系统/usr/bin/ld程序控制的过程,这里只是顺带介绍。以完整程序整个生命周期。编译、链接、启动,装载(包括动态装载)、执行):

动态库的搜索路径搜索的先后顺序是:

编译目标代码时指定的动态库搜索路径(这是通过gcc 的参数"-Wl,-rpath,"指定。当指定多个动态库搜索路径时,路径之间用冒号""分隔)

环境变量LD_LIBRARY_PATH指定的动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号""分隔)

配置文件/etc/ld.so.conf中指定的动态库搜索路径;

默认的动态库搜索路径/lib

默认的动态库搜索路径/usr/lib

 

 

我们在来对GCC这个命令的这一方面进行总结一下。

编译的时候使用-I命令可以装入include搜索路径。

连接的时候使用-l  -L命令可以装入连接搜索路径或文件

执行的时候。在当初编译连接时候使用-Wl 这个可以装入动态库的搜索路径。

分享到:
评论

相关推荐

    GCC的默认头文件路径和库文件

    GCC通过一系列环境变量来管理编译过程中的头文件和库文件搜索路径。了解并合理设置这些环境变量对于提高编译效率至关重要。 - **`C_INCLUDE_PATH`** - 用途:当编译C程序时,此环境变量用于指定头文件的搜索路径...

    头文件包含及库的链接路径问题

    - **修改环境变量**:可以通过设置`LD_LIBRARY_PATH`和`LIBRARY_PATH`环境变量来指定动态链接库和静态链接库的搜索路径。 ```bash # 动态链接库搜索路径 export LD_LIBRARY_PATH=自定义路径:$LD_LIBRARY_PATH ...

    CDT和JDT环境变量配置

    4. **INCLUDE** 和 **LIB**(Windows)/ **CPATH** 和 **LD_LIBRARY_PATH**(Linux):这些环境变量在C/C++开发中很重要,分别用于指示头文件和库文件的位置。在CDT中,正确设置这些变量可以避免找不到头文件或链接...

    udf环境变量设置vs部分技巧.docx

    首先,问题的背景是用户已经设置好的环境变量在卸载和重装VS后失效,特别是与Fluent UDF相关的`LIB`和`INCLUDE`路径。用户尝试了网上常见的三种方法来恢复这些路径,但并未取得成功。在此情况下,用户采取了一种结合...

    openssl1.1.1编译的libcrypto.lib和libssl.lib(含include与bin文件夹)

    1. **配置环境变量**:确保 `bin` 目录被添加到系统的 PATH 环境变量中,这样编译器和运行时系统就能找到必要的 DLL 文件。 2. **包含头文件**:在源代码中,通过 `#include &lt;openssl/ssl.h&gt;` 和 `#include ...

    opnet在vc2008下环境变量配置

    - **定义**:`LIBPATH` 变量用于指定链接器搜索库文件的路径。 - **配置内容**: ```plaintext C:\Windows\Microsoft.NET\Framework\v2.0.50727; D:\ProgramFiles\MicrosoftVisualStudio9.0\VC\atlmfc\lib; ``...

    windows下qt编译mysql驱动用到的include和lib

    - **配置环境变量**:将MySQL Connector/C的include和lib目录添加到系统环境变量中,使得编译器能够找到相关文件。 3. **链接MySQL驱动** - **修改qt的qmake配置**:在Qt源码的相应位置(如`src/plugins/...

    opnet与vc2005的环境变量配置

    **定义**:LIB环境变量指定了编译器在链接阶段查找库文件时应搜索的目录列表。 **示例**:在本案例中,LIB被设置为: - `C:\Program Files\Microsoft Visual Studio 8\VC\ATLMFC\LIB`:包含ATLMFC相关的库文件。 - ...

    oci include & lib

    2. 设置环境变量:设置 `ORACLE_HOME` 指向 Instant Client 的安装目录,同时将 `LD_LIBRARY_PATH` 添加到 OCI 的库文件路径。 3. 配置 Qt:在 qmake 项目文件 (.pro) 中,添加如下行来链接 OCI 库: ``` LIBS +=...

    fcgi头文件及lib库

    4. **处理请求**:在派生类的处理方法中,你可以通过FCGI的API读取和写入请求数据,如`FCGI_GetValue`用于获取环境变量,`FCGI_PutStatus`和`FCGI_PutHeader`用于设置HTTP状态码和头部,`FCGI_PutContent`用于发送...

    java环境变量设置

    JDK 目录结构是 Java 环境变量设置中的重要概念,包括 BIN 文件夹、LIB 文件夹、INCLUDE 文件夹等。了解 JDK 目录结构,可以帮助开发者更好地理解 Java 环境变量设置。 九、Java 虚拟机 Java 虚拟机是 Java 环境...

    c++ opencv4.5.0安装后的三方库文件,包括了头文件include和库lib

    1. 安装OpenCV库,并将其包含路径添加到环境变量。 2. 在源代码中包含所需的头文件。 3. 设置编译器链接器选项,指定OpenCV库的位置。 4. 编译并运行程序,确保所有依赖项都已正确配置。 OpenCV广泛应用于各种场景...

    openCV路径配置方法

    - **环境变量**:有时,通过修改系统环境变量中的`PATH`和`INCLUDE`变量,也可以达到同样的效果。 若遇到编译错误,首先检查是否漏掉了某些必要的库文件或路径配置错误。参考官方文档或社区论坛上的解决方案,往往...

    qt 调用库函数(DLL、LIB)

    这可以通过设置环境变量`PATH`或者在代码中使用`QCoreApplication::addLibraryPath()`函数添加库文件所在的路径。 3. **链接库**:在`.pro`文件中,对于DLL,我们通常不需要显式链接,只需在运行时找到相应的`.dll`...

    opnet环境变量配置

    而针对OPNET 14.5版本与Visual C++ 6.0环境下的配置,涉及到多个环境变量的设置,包括但不限于路径配置、库文件路径配置等,这对于确保OPNET模型正确运行至关重要。 #### 二、环境变量配置详解 根据题目中的描述,...

    openssl 静态 链接库 libeay32.lib ssleay32.lib 64位

    2. **配置环境**:将库文件所在路径添加到系统的库搜索路径(例如,Windows下的PATH环境变量),以便编译器能找到这些库。 3. **编译选项**:在编译你的项目时,需要指定使用静态链接OpenSSL的选项。对于Visual ...

    已编译完全的OPENCV2.4.9 lib库、dll库 、第三方资源库及头文件 适用于(visual studio)VS2010

    在VS2010中设置环境变量,主要是指配置项目属性,包括链接器设置和包含目录。你需要将OpenCV的lib目录添加到链接器的“输入”部分,将头文件的路径添加到C/C++的“常规”设置的“附加包含目录”中。此外,还需要确保...

    Dev C++图形库环境变量

    标题提到的"Dev C++图形库环境变量"就是指为Dev C++配置这些图形库的过程,以便能够编写和运行使用图形的C++程序。 在C++中,图形库是用于处理图像、动画以及用户交互的关键组件。例如,OpenGL是一个强大的跨平台...

    命令行下运行c++的环境变量配置

    3. **LIB**: 这个环境变量用来告诉编译器库文件(.lib文件或.a文件)的位置。在编译链接过程中,编译器需要知道这些库文件的位置,才能正确地链接它们。 接下来,我们来详细说明配置环境变量的步骤: **Windows系统...

Global site tag (gtag.js) - Google Analytics