gcc怎么设置默认的include,lib路径

gcc怎么设置默认的include,lib路径

《GCC:the complete referrence》说,gcc的include有以下几个组成:

1./usr/local/include
2./usr/lib/gcc-lib/i386-redhat-linux/3.2.2/include   (rh9的,别的机器作相应调整)
3./usr/target/include (rh9我没找到)
4./usr/include

在linux上编程时,很多时候会用到一些非标准的库(即自己装上去的库),这些非标准的库安装位置可能不尽相同,这就给我们编写程序时带来了麻烦。

本文就是旨在替和我一样的菜鸟解决这一问题,水平有限,行文难免谬误,望大虾们不吝赐教。

在linux上编程时,很多时候会用到一些非标准的库(即自己装上去的库),这些非标准的库安装位置可能不尽相同,这就给我们编写程序时带来了麻烦。

本文就是旨在替和我一样的菜鸟解决这一问题,水平有限,行文难免谬误,望大虾们不吝赐教。

1。头文件的位置

gcc默认会在 /usr/include目录下寻找头文件,这是标准库的头文件的路径,但非标准的库一般不会把头文件直接放在该目录下,一般的作法是在该目录下创建一个 自己的目录,然后在此目录下直接或分门别类(即再创建更深层次的目录,gtk+即一例证)放自己的头文件。如果是这样,gcc编译时是不会找到这些头文件 的,我们会看到有“×××: No such file or directory”的出错信息。解决的方法就是用gcc的-I选项列出这些非标准的路径(实际编程当中一般是由pkg-config --cflags 完成这一工作的)。

2。库的位置

gcc默认会链接标准c语言库,但如果所用的库是“舶来品”,gcc自然不会自动链接,如果也没有显式链接的话,在链接阶段就会出现诸如“: undefined reference to `gtk_container_set_border_width'

/tmp/ccvHaxUx.o(.text+0x1af): In function `main':”的错误。解决的方法就是利用gcc的-l参数显式链接需要链接的库。这样gcc就会按照一种特定的命名规则到默认的目录 (/usr/lib和/lib等目录)下去寻找这些库,并自动链接。但如果库放在自己的定义的目录下,gcc还是不能找到的,这种情况下可以用gcc -L来列出非标准库的路径。实际编程中这一工作是由pkg-config --libs完成的。

上面两次提到pkg-config命令,各位可能就会有疑问了:难道pkg-config前知八百年,后知八百年,无所不能?非也,其实pkg-config也有自己的一套规则来提供关于所查询库的信息。

当要查询指定库(如gtk+-2.0库)的信息时,我们要以gtk+-2.0为参数运行pkg-config命令(如pkg-config --libs --cflags gtk+-2.0)。此时,pkg-config会到默认目录(如/usr/lib/pkgconfig目录)以及PKG_CONFIG_PATH指定的 目录去找一个配置文件,该文件就记录了所查询的库在该系统上信息。该配置文件的命名规则是:所查询库的名字加上后缀.pc。若要查询gtk+-2.0的信 息,则pkg-config会按上面所说的寻找gtk+-2.0.pc。如果找到,万事大吉,直接根据找到的文件的内容显式库的信息。如果找不到以.pc 为后缀的配置文件,则显示出错信息提示用户继续寻找。例如:

代码:

[leo@leo ~]$ pkg-config --libs --cflags gtkmm-2.0

Package gtkmm-2.0 was not found in the pkg-config search path.

Perhaps you should add the directory containing `gtkmm-2.0.pc'

to the PKG_CONFIG_PATH environment variable

No package 'gtkmm-2.0' found

这就有两种可能:一是gtkmm-2.0.pc没有放在/usr/lib/pkg-config下。二就是gtkmm-2.0根本就没有装。

对应的解决方法:第一种情况直接用find,locate等命令把gtkmm-2.0.pc找出来,把路径加入环境变量PKG_CONFIG_PATH 中,再运行命令pkg-config --libs --cflags gtkmm-2.0。第二种情况就只能安装gtkmm-2.0库了。

关pkg-config的更详细的用法请参加pkg-config的manpage:)

如前所述,当显式链接库时,gcc会按自己的规则去寻找库的名字,现在就来说说库的命名规则。

系统中的库分两类,静态库和动态库(关于动态库和静态库的区别以及如何添加自己的库,我想需要用另一篇文章来专门叙述了,以后有时间再详细写下来吧)。静 态库和动态库在命名上的区别就是后缀名不同而已。动态库以.so(意为shared object)结尾,而静态库一.a(意为archive)结尾。由于种种原因,链接时是优先链接动态库的,如果不成功,则链接静态库。

除了有相区别的后缀外,动态和静态库都有相同的前缀lib,这样动态库就有形如libXX.so的形式,相应的,静态库的名字看起来会是这样libXX.a。

比如,用-lm参数链接数学库时,gcc就会去寻找libm.so或libm.a。

不修改/etc/ld.so.conf使用非默认路径下的库文件--LD_LIBRARY_PATH

环境变量LD_LIBRARY_PATH列出了查找共享库时除了默认路径之外的其他路 径。如果不想修改或无法修改(无root权限)/etc/ld.so.conf而使用其他路径下的库文件就需要设置LD_LIBRARY_PATH了。 例:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/lib这样就可以使用/opt/lib下的库文件啦

gcc怎么设置默认的include,lib路径相关推荐

  1. arm-linux-gcc 头文件搜索路径,gcc和arm-linux-gcc默认头文件库搜索路径

    参考: GCC ARM-linux-GCC 一.GCC gcc编译时查找头文件,按照以下路径顺序查找: 1. gcc编译时,可以设置-I选项以指定头文件的搜索路径,如果指定多个路径,则按照顺序依次查找 ...

  2. vs2012 设置默认的 include 目录

    最近升级到 vs2012, 发现设置 vc include 目录跟以前不一样了. 具体方法如下: 菜单 :视图->属性管理器 在属性管理器里展开相关节点,猛击"Microsoft.Cp ...

  3. VBA设置默认/缺省运行路径的方法

    在设计VBA脚本时,有时我们需要在指定目录中运行或打开第三方程序/文件,那么最好的方法就是使用ChDir命令更改当前默认的运行路径,以便脚本能轻松地找到所需文件. 更改缺省文件夹或驱动器(ChDir ...

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

    环境变量 系统环境变量 我们知道,我们经常要设置一些环境变量,系统环境变量我们非常容易理解.其实我们在windows中经常容易接触.其实环境变量是一个非常广泛的一个概念,它与web应用程序中的web. ...

  5. 关于环境变量 C++ include搜索路径,lib库搜索路径

    OneCoder在学习C++的过程中,在研究Windows下Eclipse for C/C++开发环境的过程中遇到的一些关于C++环境变量的一些问题.在网上搜索一番,得到下面的文章,与大家分享. 转自 ...

  6. Git 技术篇-git切换工作空间,git设置默认进入空间,git初始化工作空间

    Git工作空间切换 git 通过 cd 来切换工作空间.路径要为正斜杠. 第一次使用该空间要 git init 进行初始化. 看到后面的蓝色 master 就算成功了. Git设置默认进入空间 设置 ...

  7. C和C++中include 搜索路径的一般形式以及gcc搜索头文件的路径

    C和C++中include 搜索路径的一般形式 对于include 搜索的路径: C中可以通过 #include <stdio.h> 和 #include "stidio.h&q ...

  8. CMAKE设置INSTALL工程,分别设置头文件、Lib和DLL的输出路径

    使用CMAKE管理工程,可以设置工程中的INSTALL项目运行时安装的路径,使用命令:install. 可以简单的设置安装文件的路径和文件夹: set(head_files//要安装的头文件 ) in ...

  9. CFileDialog设置默认路径

    CFileDialog设置默认路径 //显示打开文件对话框 TCHAR szFilter[] = _T("所有图像|*.jstjpg|"); //构造打开文件对话框 CFileDi ...

最新文章

  1. python 跳出两层循环,跳出多层循环
  2. 屏显有啥硬科技可卷?让现在电视厂商这么拼
  3. 【数字信号处理】周期序列 ( 周期序列表示方法 | 主值区间表示法 | 模 N 表示法 )
  4. Taro+react开发(22)--模态框组件
  5. jdk的selector(2)channel的注册
  6. 直降500+24期免息!天猫双11全线iPhone打折
  7. php $path_info,PHP $_SERVER['PATH_INFO'] 无法获取到内容怎么办?
  8. [周榜单]极乐小程序榜单(第十一期)
  9. 多模态 | 从顶会论文看多模态预训练研究进展
  10. 解决GBK字符转UTF-8乱码问题
  11. PowerTip of the Day-Removing Empty Things
  12. [需求管理-6]:需求分析 - 技术可行性研究与方案设计模板
  13. 手机客户端接口开发文档模板整理
  14. Linux深度学习框架安装
  15. java 框架医院系统,java毕业设计_springboot框架的医院信息管理系统
  16. 计算机视力集合训练程序,【视觉训练】集合功能训练的方法及步骤
  17. Android Camera 测光梳理
  18. 如何使用css动画做出剑客行走效果
  19. 中科大+快手出品 CIRS: Bursting Filter Bubbles by Counterfactual Interactive Recommender System 代码解析
  20. 什么是 SEO 投资回报率,以及如何衡量它?

热门文章

  1. macd api 获取股票 技术指标
  2. 【面试题-算法思想】如何从包含大量URL的A,B文件中找到相同的URL?
  3. 【搜索入门专题1】hdu1253 【BFS】 F - 胜利大逃亡
  4. icp许可证到底是什么?企业一定要办理吗?
  5. ASP如何计算中英文混合字符串长度和截取字符串
  6. Websocket 可以玩出些什么花儿?(建议收藏)
  7. C#将文件复制到另一个目录下
  8. python实现中文文本分句
  9. 【单片机】心形流水灯の制作指南(保姆级)
  10. 华大半导体 HC32F4A0 系列开发笔记