C/C++程序在linux下被编译和连接时,GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径。自己指定的路径就不说了,这里说明一下系统自动搜索的路径。

【1】include头文件路径

除了默认的/usr/include, /usr/local/include等include路径外,还可以通过设置环境变量来添加系统include的路径:

# C

export C_INCLUDE_PATH=XXXX:$C_INCLUDE_PATH

# CPP

export CPLUS_INCLUDE_PATH=XXX:$CPLUS_INCLUDE_PATH

以上修改可以直接命令行输入(一次性),可以在/etc/profile中完成(对所有用户生效),也可以在用户home目录下的.bashrc或.bash_profile中添加(针对某个用户生效),修改完后重新登录即生效。

【2】link链接库文件路径

链接库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的(也可以在编译命令中通过 -l  -L 来指定,这里讲的是使用系统默认搜索路径)。

一般 Linux 系统把 /lib  /usr/lib  /usr/local/lib 作为默认的库搜索路径,所以使用这几个目录中的链接库文件可直接被搜索到(不需要专门指定链接库路径)。对于默认搜索路径之外的库,则需要将其所在路径添加到gcc/g++的搜索路径之中。

链接库文件的搜索路径指定有两种方式:1)修改/etc/so.ld.conf   2)修改环境变量,在其中添加自己的路径

1)在环境变量中添加

动态链接库搜索路径:

export LD_LIBRARY_PATH=XXX:$LD_LIBRARY_PATH

静态链接库搜索路径:

export LIBRARY_PATH=XXX:$LIBRARY_PATH

以上修改可以直接命令行输入(一次性),可以在/etc/profile中完成(对所有用户生效),也可以在用户home目录下的.bashrc或.bash_profile中添加(针对某个用户生效),修改完后重新登录即生效。

2)在/etc/ld.so.conf 中添加指定的链接库搜索路径(需要root权限),然后运行 /sbin/ldconfig,以达到刷新 /etc/ld.so.cache的效果。

以上两种方式均可以达到指定链接库搜索路径的效果。

第二种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库) 的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。这是因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,系统会直接读取 /etc/ld.so.cache 并从中进行搜索的。/etc/ld.so.cache 是一个非文本的数据文件,不能直接编辑,它是根据 /etc/ld.so.conf 中设置的搜索路径由 /sbin/ldconfig 命令将这些搜索路径下的共享库文件集中在一起而生成的(ldconfig 命令要以 root 权限执行)。因此,为了保证程序执行时对库的定位,在 /etc/ld.so.conf 中进行了库搜索路径的设置之后,还要运行 /sbin/ldconfig 命令,更新 /etc/ld.so.cache 文件。

ldconfig的作用就是将/etc/ld.so.conf 指定的路径下的库文件缓存到/etc/ld.so.cache 。因此当安装完一些库文件(例如刚安装好glib),或者修改ld.so.conf增加新的库路径后,需要运行一下/sbin/ldconfig 使所有的库文件都被缓存到ld.so.cache中,不然修改的内容就等于没有生效。

在程序连接时,对于库文件(静态库和共享库)的搜索路径,除了上面的设置方式之外,还可以通过 -L 和 -l 参数显式指定。因为用 -L 设置的路径将被优先搜索,所以在连接的时候通常都会以这种方式直接指定要连接的库的路径。

注意:

1)在配置环境变量的时候,等号前面不要加空格,否则可能出现 command not found

2)修改/etc/ld.so.conf后,当系统重新启动后,所有基于 GTK2 的程序在运行时都将使用新安装的 GTK+ 库。由于 GTK+ 版本的改变,有时会给应用程序带来兼容性的问题,造成某些程序运行不正常。为了避免出现这些情况,在 GTK+ 及其依赖库的安装过程中对于库的搜索路径的设置将采用环境变量的方式
    export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH

linux c 编译时 include 和 链接库 文件路径指定相关推荐

  1. linux下C/C++编译时系统搜索 include 和 链接库 文件路径的指定

    C/C++程序在linux下被编译和连接时,GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径.自己指定的路径就不说了,这里说明一下系统自动搜索的路径. [1 ...

  2. Linux编译时如何减小so库文件的大小

    Linux编译时如何减小so库文件的大小 今天问了我这个问题,我就顺便记录一下.客户问为什么libc.so文件再编译前和编译后的size不一样啊,staging 和 compile 两个dir下的 l ...

  3. Linux系统中如何添加自己的库文件路径

    库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的.一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用 ...

  4. linux下的动态链接库和静态链接库到底是个什么鬼?(一)静态链接库的编译与使用...

    知识不等于技术,这句话真的是越工作的时间长越深有体会,学习到的知识只有不断的实践,才成真正在自已的心里扎下根,成为自身的一部分,所以无论如何,我希望我的博客可以一直写下去,慢慢的沉淀,终会有回报,无聊 ...

  5. linux下运行时链接库的路径顺序

    那么自制的库在没有指定运行时库的路径时,一般是不会找到你特定目录的,先来说说链接库的搜寻顺寻: 1.编译目标代码时指定的动态库搜索路径(指的是用-wl,rpath或-R选项而不是-L): exampl ...

  6. GCC 编译 C(C++)静态链接库(gcc -L、gcc -l)和动态链接库(gcc -fPIC -shared)的创建和使用

    1. 库文件 所谓库文件,读者可以将其等价为压缩包文件,该文件内部通常包含不止一个目标文件(也就是二进制文件). 值得一提的是,库文件中每个目标文件存储的代码,并非完整的程序,而是一个个实用的功能模块 ...

  7. Boost 1.59.0 编译支持Python3的链接库,生成vc120或vc140

    Boost 1.59.0 编译支持Python3的链接库,生成vc120或vc140 官方编译的Boost中只带了Python2的链接库,Python3的链接库需要自己特别编译,官方编译版下载地址:h ...

  8. linux 链接库文件出现“undefined reference to 问题的解决方法

    最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func' 关于unde ...

  9. CCS编译添加链接库文件与头文件的方法

    编译的include文件目录 Compiler -> Preprocessor->include search path //include文件搜索路径 $(Proj_dir);     ...

最新文章

  1. JAVA Web项目中所出现错误及解决方式合集(不断更新中)
  2. Linux 系统 rpm安装ipvsadm.src.rpm
  3. Oracle 管道化表函数(Pipelined Table)[转载]
  4. java字符串表表容量_java – 我可以使用什么符号表来存储~50 mil的字符串,快速查找而不会耗尽堆空间?...
  5. cordova 更改app版本_Cordova打包Android应用流程(MAC)
  6. eclipse 安装git
  7. select、bash函数初识及rpm命令详解
  8. lonlifeOJ1152 “玲珑杯”ACM比赛 Round #19 概率DP
  9. oracle sysman 不存在_Oracle数据库中SYS、SYSTEM、DBSNMP、SYSMAN四用户的区别
  10. C++小游戏——推箱子
  11. 列表ListBox、ListView、GridView 排序
  12. 听说Unscrambler HSI是个很牛的光谱分析软件?
  13. 宣讲会通知|香港科技大学工学院理学硕士线上直播综合场【MSc】
  14. 用人机对话系统设计逻辑探究人工智能产品经理
  15. 解决 Please use the NLTK Downloader to obtain the resource
  16. [转载]轻松学习XML(六)
  17. Mybatis-Plus如何使用
  18. SpyNote的APK无法运行的问题
  19. ubuntu下Android开发环境的搭建:eclipse+SDK详细安装教程+常见问题及其解决方案
  20. 前端,java后端开发,数据分析师应该掌握的技术,不要盲目跟风

热门文章

  1. Go 语言编程 — go mod 依赖包管理
  2. Go 语言编程 — defer 关键字
  3. 为什么说 TCP/IP 是一个不确定性网络
  4. Linux_SquidProxyServer代理服务器
  5. bootcmd 和 bootargs 环境变量
  6. 新电脑一般javaweb配置
  7. java循环练习:水仙花数
  8. 彩色图像--色彩空间 YIQ 、YUV 、YCbCr 、YC1C2 和I1I2I3
  9. 《Java Web高级编程——涵盖WebSockets、Spring Framework、JPA H
  10. 全排列之递归与非递归算法实现总结