zoukankan      html  css  js  c++  java
  • C/C++ 头文件以及库的搜索路径

    关键点: 1. #include <...> 不会搜索当前目录
         2. 使用 -I 参数指定的头文件路径仅次于 搜索当前路径。
         3. gcc -E -v 可以输出头文件路径搜索过程

    C++编译时,教科书中写道:#include “headfile.h”优先在当前目录查找头文件;#include < headfile.h >从系统默认路径查找头文件。先前以为系统默认路径是环境变量$PATH指定的路径,在系统上一查,傻了眼:
    -bash-3.2$ echo $PATH
    /usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/X11R6/bin:/usr/java/j2re1.4.0/bin:/usr/atria/bin:/ccase/bin:/home/devcomp/bin
    全是bin目录,$PATH是运行可执行文件时的搜索路径,与include头文件的搜索路径无关,可能不少人犯了我这样的错误。

    头文件:
    1. #include “headfile.h”
    搜索顺序为:
    ①先搜索当前目录
    ②然后搜索-I指定的目录
    ③再搜索gcc的环境变量CPLUS_INCLUDE_PATH(C程序使用的是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<>方式不会搜索当前目录!

    这里要说下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会去找-L
    ②再找gcc的环境变量LIBRARY_PATH
    ③再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的(不可配置的?)

    运行时动态库的搜索路径:
    动态库的搜索路径搜索的先后顺序是:
    ①编译目标代码时指定的动态库搜索路径(这是通过gcc 的参数"-Wl,-rpath,"指定。当指定多个动态库搜索路径时,路径之间用冒号":"分隔)
    ②环境变量LD_LIBRARY_PATH指定的动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)
    ③配置文件/etc/ld.so.conf中指定的动态库搜索路径;
    ④默认的动态库搜索路径/lib;
    ⑤默认的动态库搜索路径/usr/lib。
    (应注意动态库搜寻路径并不包括当前文件夹,所以当即使可执行文件和其所需的so文件在同一文件夹,也会出现找不到so的问题,类同#include <header_file>不搜索当前目录)

    参考资源:http://my.oschina.net/alphajay/blog/4953?from=rss

  • 相关阅读:
    K近邻法
    感知机
    统计学习(统计机器)方法概论
    查看GPU占用率以及指定GPU加速程序
    HYPERSPECTRAL IMAGE CLASSIFICATION USING TWOCHANNEL DEEP CONVOLUTIONAL NEURAL NETWORK阅读笔记
    LRN(local response normalization--局部响应标准化)
    A NEW HYPERSPECTRAL BAND SELECTION APPROACH BASED ON CONVOLUTIONAL NEURAL NETWORK文章笔记
    徒步橘子洲
    高薪
    协作
  • 原文地址:https://www.cnblogs.com/answercard/p/7763299.html
Copyright © 2011-2022 走看看