介绍GCC在编译阶段和程序运行阶段用到的环境变量。

GCC编译时用到的环境变量

GCC编译时用到的变量。

C_INCLUDE_PATH

GCC编译时查找头文件的目录列表。比如:

echo $C_INCLUDE_PATH
# outputs
## /usr/include:/usr/local/include

CPLUS_INCLUDE_PATH

类似C_INCLUDE_PATH,适用于g++。

LIBRARY_PATH

gcc和g++在编译的链接(link)阶段查找库文件的目录列表,比如:

echo $LIBRARY_PATH
# outputs
## /usr/lib:/usr/lib64:/usr/local/lib:/usr/local/lib64

程序运行时用到的环境变量

程序运行阶段用到的变量。

LD_LIBRARY_PATH

程序运行时查找动态链接库(.so文件)的目录列表。比如:

echo $LD_LIBRARY_PATH
# outputs
## /usr/lib:/usr/lib64:/usr/local/lib:/usr/local/lib64

LD_PRELOAD

LD_PRELOAD(参考man ld.so的LD_PRELOAD部分)中定义的动态链接库会在其他动态链接库之前被加载,因此会覆盖其他链接库里定义的同名符号(函数变量等),完整的例子可参考test-ld-preload。需要注意的是,在C++中覆盖C函数库中的函数时,应使用extern "C"阻止Name Mangling

su
LD_PRELOAD=/usr/lib/libtsocks.so apt-get update

注意,LD_PRELOAD无法在sudo命令里使用。1

Debian动态链接库搜索路径

Debian系统上,如果修改LD_LIBRARY_PATH没有用,可修改/etc/ld.so.conf或/etc/ld.so.conf.d/*.conf,将库目录作为一行加入以上的conf文件中,然后运行ldconfig命令即可。

vi /etc/ld.so.conf.d/my.conf
ldconfig

或者自定义一个库目录的配置文件(例如my.conf),然后用ldconfig -f /path/to/my.conf加载该配置文件。

vi ~/project/test/ld_lib.conf
ldconfig -f ~/project/test/ld_lib.conf

ld_lib.conf的例子。

/usr/local/lib
/path/to/your/shared/lib/directory

ld.so查找库文件的顺序

ld.so用于查找并加载动态链接库文件(*.so),详情可参考man ld.so

ld.so loads the shared libraries needed by a program, prepares the program to run, and then runs it. Unless explicitly specified via the -static option to ld dur? ing compilation, all Linux programs are incomplete and require further linking at run time.

 The necessary shared libraries needed by the program are searched for in the following order

 o      Using the environment variable LD_LIBRARY_PATH (LD_AOUT_LIBRARY_PATH for a.out programs).  Except if the executable is a setuid/setgid binary, in which  case it is ignored.

 o      From the cache file /etc/ld.so.cache which contains a compiled list of candidate libraries previously found in the augmented library path.

 o      In the default path /lib, and then /usr/lib.

对于/etc/ld.so.conf.d/里的conf文件,则是按字母序依次加载。假设需要使用/usr/local/lib目录下的库文件覆盖系统的库文件,可以把包含/usr/local/lib的配置文件排地靠前一些。

$ ls -1 /etc/ld.so.conf.d
00_libc.conf
x86_64-linux-gnu.conf
zz_i386-biarch-compat.conf $ cat 00_libc.conf
/usr/local/lib

阅读资料

 
 

GCC相关的环境变量的更多相关文章

  1. 系统区域设置 本地语言的支持依赖于 /etc/locale.conf,/etc/locale.conf 包含不少于此相关的环境变量

    https://linux.cn/lfs/LFS-BOOK-7.7-systemd/chapter07/locale.html 7.7. 系统区域设置 本地语言的支持依赖于 /etc/locale.c ...

  2. Linux设置:环境变量

    一.在相关配置文件中添加可执行文件/头文件/静态库/动态库的搜索路径 对所有用户有效在/etc/profile添加. 只对当前用户有效在Home目录下的.bashrc或.bash_profile里添加 ...

  3. [转载]GCC 编译使用动态链接库和静态链接库--及先后顺序----及环境变量设置总结

    来自http://blog.csdn.net/benpaobagzb/article/details/51364005 GCC 编译使用动态链接库和静态链接库 1 库的分类 根据链接时期的不同,库又有 ...

  4. linux环境变量配置总结

    LD_LIBRARY_PATH: 动态库的查找路径设置:方法一: export  LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX 但是登出后就失效方法二: 修改~/.bash ...

  5. (大数据工程师学习路径)第一步 Linux 基础入门----环境变量与文件查找

    环境变量与文件查找 本节介绍环境变量的作用与用法,及几种搜索文件的方法.学会这些技巧高效地使用 Linux. 一.环境变量 1.变量 要解释环境变量,得先明白变量是什么,准确的说应该是 Shell 变 ...

  6. linux的环境变量与文件查找

    1. 环境变量 1.1 变量 shell 中的变量有不同类型,可参与运算,有作用域限定 变量的作用域即变量的有效范围(比如一个函数中.一个源文件中或者全局范围),在该范围内只能有一个同名变量.一旦离开 ...

  7. Linux环境变量及其设置

    简介 环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或多个应用程序将使用到的信息.Linux是一个多用户的操作系统,每个用户登录系统时都会有一个专用的运行环境,通常情况下每个用户的默认的环 ...

  8. linux环境变量 shell变量 command not found解决方法(转)

    在Ubuntu.centos中有如下几个文件可以设置环境变量1./etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文 ...

  9. Linux下设置环境变量

    setenv(set environment variable) 功能说明:查询或显示环境变量. 语 法:setenv [变量名称][变量值] 补充说明:setenv为tsch中查询或设置环境变量的指 ...

随机推荐

  1. Yeoman安装

    Yeoman帮助我们创建项目,提供更好的工具来使我们的项目更多样化. Yeoman提供generator系统,一个generator是一个插件,在我们在一个完整的项目上使用‘yo’命令时,会运行该ge ...

  2. php几个比较高级的函数

    1.传递任意数量的函数参数 我们在.NET或者JAVA编程中,一般函数参数个数都是固定的,但是PHP允许你使用任意个数的参数.下面这个示例向你展示了PHP函数的默认参数: 1 2 3 4 5 6 7 ...

  3. Android 下拉刷新控件Android-PullToRefresh

    需要用到一个开源库 Android-PullToRefresh https://github.com/chrisbanes/Android-PullToRefresh ---------------- ...

  4. 编程思想—依赖注入(DI)并非实现控制反转(IOC)的最佳方法

    以构造函数注入为例: public class TestClass(IClassA a,IClassB b, IClassC C,IClassD d) { public void Method1() ...

  5. Junit 源码剖析(一)

    采用Junit4.8.2分析Junit实现架构 源码架构两个大包:junit包 org包 首先分析org.junit.runners.model包下的几个类 org.junit.runners.mod ...

  6. 【关于php】Appserv的安装注意事项

    之前的安装,问题应该不大,一路点“安装——Next——next·····”就行,下面是一些注意事项: (1)AppServ安装路径的选择.具体安装在哪个磁盘下用户可以自行选择,也可以使用默认的安装位置 ...

  7. 自定义元素–为你的HTML代码定义新元素

    注意:这篇文章介绍的 API 尚未完全标准化,并且仍在变动中,在项目中使用这些实验性 API 时请务必谨慎. 引言 现在的 web 严重缺乏表达能力.你只要瞧一眼“现代”的 web 应用,比如 GMa ...

  8. 移植qt5.3.1到arm

    最近刚入手一款开发板(比较低端,刚毕业工作还没一个月,穷屌丝一个).在学校以前都是用的是Friendly Arm的6410,使用的qt版本是使用的最多的4.7.0版本,入手的板子是4.7.4.qt5出 ...

  9. Unity Diffuse Metal Shader Mod

    Shader "MetalShader" { Properties { _MainTex ("Base (RGB) RefStrGloss (A)", 2D) ...

  10. 4G

    4G网络的概念是什么 浏览:5461 | 更新:2013-02-16 15:08 4G是第四代无线传输技术的缩写,它是宽带移动通信阶段,是继3G的标准的另一个阶段.随着Internet及多媒体技术的快 ...