头文件的查找方式和库的搜索路径

 

对于以压缩包发布的软件,在它的目录下通常都有一个配置脚本configure,它的作用确定编译参数(比如头文件位置、连接库位置等),然后生成Makefile以编译程序。可以进入该软件的目录,执行"./configure --help"命令查看使用帮。

一个程序能正确编译、链接、运行需要满足3个条件:预处理时能找到头文件,连接时能找到库,运行时能找到库。下面分别介绍:

1.指定头文件位置

在程序中常用两种方法来包含头文件:

#include <headerfile.h>
        #include "headerfile.h"

他们的区别是,对于第二种方法,首先在源文件当前目录下查找头文件,如果找不到,再像第一种方法一样去编译命令指定、系统预设的目录去找。这些"指定的"、"预设的"目录在什么地方呢?"指定的"头文件目录是编译程序时使用"-I"指定目录,"预设的"的头文件目录是由编译器自己决定的。通过一个例子可以看到这点,执行一下命令:

mkdir -p /work/AAA/include /*临时目录,测试用*/
        mkdir -p /work/BBB/include /*临时目录,测试用*/

export C_INCLUDE_PATH=/work/AAA/include

echo ‘main() {}‘ | arm-linux-gcc -I/work/BBB/include -E -v -

得到以下输出内容,从中可以看到查找头文件时的路径及优先顺序:
        ...
        #include "....." search starts here:
        #include <.....> search starts here:

/work/BBB/include
        /work/AAA/include

...

可以总结出头文件的查找路径及优先顺序。

1.如果源文件中使用双引号来包含头文件,则首先在源文件当前目录查找头文件。
        2.如果编译时使用"-I/some/dir",则在/some/dir中查找。
        3.如果设置了环境变量C_INCLUDE_PATH,则在指定的目录中查找。
        4.最后在编译器预设的路径中查找,这是不需要指定的。

所以,编译程序时如果出现了找不到头文件的错误,可以通过设置C_INCLUDE_PATH或给编译器设置"-I"选线来指定头文件目录,这可以在执行配置命令configure之前设置C_INCLUDE_PATH或CFLAGS,如果不设置CFLAGS,它的默认值为"-g -O2",比如:

export C_INCLUDE_PATH="/some/dir/1:/some/dir/2"
        export CFLAGS = "-g -O2 -I/some/dir" #如果设置了C_INCLUDE_PATH,就可以不设置CFLAGS

./configure

还有更好的方法,当明确知道要使用哪个动态库时,可以通过pkg-config命令获知要使用这个库时编译时的参数、连接时的参数。

先执行一下命令体验一下:

export PKG_CONFIG_PATH=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/pkgconfig

pkg-config --cflags uuid

-I/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/include

交叉编译时库的搜索路径

1.“-L”指定连接时库的搜索路径,这些库使用"-l"来显示指定,比如"-labc"表示的库文件为libabc.so

2."-rpath-link"比"-L"多一项功能,它指定的目录还可以用于搜索依赖库。

3."-rpath"比"-rpath-link"多一项功能,它指定的目录会被编译进程序中,当程序运行时,首先从这些目录中寻找库。

怎样指定"-rpath-link"呢?连接器arm-linux-ld通常是由arm-linux-gcc间接启动的,而arm-linux-gcc并不认识"-rpath-link"选项,所以需要在前面加上关键字"-Wl",表示选项用于连接器。在执行配置命令configure之前设置LDFLAGS即可,比如:

export LDFLAGS="-Wl,-rpath-link-Wl,/work/crossbuild/X/lib -Wl,-rpath-link-Wl,/work/corssbuild/GTK/lib"

./configure

指定运行时库的位置

运行库时的查找路径及优先顺序如下

1.编译时使用"-rpath"指定目录
        2.环境变量LD_LIBRARY_PATH指定的目录(它可以指定多个目录,以冒号分隔)。
        3.默认路径:/lib、/usr/lib.

时间: 2024-10-09 05:53:59

头文件的查找方式和库的搜索路径的相关文章

Linux动态库(.so)搜索路径

主要内容: 1.Linux动态库.so搜索路径 编译目标代码时指定的动态库搜索路径: 环境变量LD_LIBRARY_PATH指定的动态库搜索路径: 配置文件/etc/ld.so.conf中指定的动态库搜索路径: 默认的动态库搜索路径/lib: 默认的动态库搜索路径/usr/lib. 2.通过实例验证五种动态库的搜索路径以及其先后顺序 众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib.动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库,并且该 动 态库还未加载到

linux动态库默认搜索路径设置的三种方法

众所周知, Linux 动态库的默认搜索路径是 /lib 和 /usr/lib .动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库, 并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函 数,以及该动态库的其它资源了.在 Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定. 方法一:在配置文件 /etc/ld.so.conf 中指定动态库搜索路径.每次编辑

IAR 数据类型/扩展关键字/位操作/SRAM操作/中断/头文件/汇编嵌入方式

--数据类型 数据类型(编译器支持 ISO/ANSI C 基本数据类型和一些附加数据类型) 1.1. 整型数据 bool 数据类型在C++语言里是默认支持的.如果你在C代码的头文件里包含stdbool.h, bool数据类型也可以使用在C语言里.也可以使用布尔值 false和 true. 1.2.浮点数据类型: 1.3.指针类型:指针有数据指针和函数指针. 1.数据指针: 数据指针的大小为8位,16位,24位.定义为:在整型数据类型后加"*"符号. 例如:char * p; 整型数据没

#include&lt;stdio.h&gt;的头文件的查找 #import&lt;Foundation/NSObjCRuntime.h&gt;头文件的查找 在Xcode下查找-城

1.Foundation框架下的头文件在Xcode下的路径: NSObjCRuntime.h的路径:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/Foundation.framework/Headers 2.include文件夹下的头文件在Xcode下的路径: include下的stdio.h的

PHP里文件的查找方式及写法

PHP里说的文件包括:文件和目录1.用filetype方法加路径("./11.txt")是判断文件类型 //var_dump(filetype("./11.txt"));//判断文件类型.是文件返回:string 'file' (length=4).如果返回string 'dir' (length=3)代表目录的意思.也就是文件夹 2.用is_dir("");判断是不是目录//var_dump(is_dir("./22"));

(转) C语言头文件、库文件的查找路径

在程序设计中,文件包含是很有用的.一个大的程序可以分为多个模块,由多个程序员分别编程.有        些公    用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头用包含命令包含该文件即可使        用.这样,可避免在每个文件开头都去书写那些公用量,从而节省时间,并减少出错. 对文件包含命令还要说明以下几点:1. 包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来.例如以下写法都是允许的:    #include"stdio.h"    #include   

C语言头文件、库文件的查找路径

在 程序设计中,文件包含是很有用的.一个大的程序可以分为多个模块,由多个程序员分别编程.有些公用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头用包含命令包含该文件即可使用.这样,可避免在每个文件开头都去书写那些公用量,从而节省时间,并减少出错. 对文件包含命令还要说明以下几点:1. 包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来.例如以下写法都是允许的:    #include"stdio.h"    #include    但是这两种形式是有区别的:使用尖括号表

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=XX

27&gt;&gt;gcc编译时头文件和库文件搜索路径

一.头文件 gcc 在编译时寻找所需要的头文件 : ※搜寻会从-I开始(gcc 参数,指定头文件搜索位置) ※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH ※再找内定目录 /usr/include /usr/local/include /usr/lib/gcc-lib/i386-linux/2.95.2/include /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i