C++ 编译搜索路径(包括include搜索路径和连接搜索路径

来源:互联网 发布:alpha beta算法 编辑:程序博客网 时间:2024/06/14 01:52

C++ 编译搜索路径(包括include搜索路径和连接搜索路径)

 (2012-04-11 18:16:04)
转载
标签: 

杂谈

分类: Cpp

今天试试mysql connector c++. 下载了已经编译好的文件,里面有两个非常重要的文件夹分别是:

include 和 lib

 

include

如果不深究,你很快就知道头文件的作用,在你使用这个这个库里面的类、方法的时候,需要使用include的方法引入,这个我们前面都说过,也很容易理解。include文件中包含了所有你要使用的东西的声明,编写程序的时候你通过include语句将所要使用的东西的声明copy过去。这样编译就可以成功了。

关键是,这个include文件夹我们放在那里去?

这个时候就涉及到了,编译的时候,include默认搜索路径的问题。网上有很多这方面的介绍,有几个原则这里说明一下:

(1)著名的使用<> 和“”的区别。这么说吧,<>有一系列的待选访问文件夹(路径),编译器依次访问,先找到先用。那么“”就是在<>那一系列的访问路径前面,加上一个“当前目录”

(2)这是我一直的误解,我不知道大家有没有误解。我之前认为会在哪些路径(目录),下面深入搜索下去。当初也不知道为什么就有这个想法。不过今天折腾了好长时间,得出的结论是,编译器只会搜索哪些指定路径(目录)下面的那些文件,不会继续打开下层文件夹继续搜索。

     这个可以从好几个方面看出:

    1)如果是嵌套搜索,将会导致搜索时间加长。

    2)观察/include/里面的那些头文件的组织方式,你会发现他们呈现出较为平行的分布模式,也就是说,在一个大的功能模块(一个文件夹)下面很少还会有更深的文件夹。

(3)记住,头文件引入预编译语句include只是引入头文件,它可以使用绝对地址,也可以使用相对地址,这里的相对地址,指的是以那些设置好的一些列路径(文件夹、目录)为起始的相对地址,所以,如果你要使用头文件是在那些路径的下面的某个没有进入待选路径的文件夹,你可以使用/加入文件夹前缀。 include <cppconn/driver.h>

lib

 其实,如果你继续不深究,你也可以很简单的知道,lib是库文件,而库文件分成两种,静态和动态。库文件的作用是在链接的时候出现的。事实上,我们通常接触不到它。更为准确的将,我们进行链接的时候,是将各个目标文件(编译而来),以及库文件,合成在一起形成一个可执行程序。

我们编译好的那些目标文件,有些在程序中所处的角色和库文件是一样的——都是那些头文件的实现文件。链接的动作,就是“兑现头文件(声明)所做的承诺(有这个东西)”

怎么兑现呢?有两种方法:

1,直接将那些实现合并进来。这就是著名的静态链接。

2,告诉你一个地址以及相关信息,你可以去看看,并且保存相关的引用信息。但是并不合并进你的程序。待你的程序执行的时候,使用当初你保留的引用信息,就可以使用这个公用的“实现代码”。这就是著名的动态链接。

 

 

 

bin include lib 梳理

 

我们在从linux文件目录上看看这些东西的分布。

linux文件系统中,有些目录需要我们注意,注意,linux目录的安排是一种管理方式上的决定,也就是说,GNU希望大家都遵守这种文件安排模式,利于交流和可阅读。

我们会经常看到bin/sbin include lib三种文件夹。

 

bin/sbin:

bin来源于binary,也就是二进制文件,在linux中,文件尽量是明文的(也就是字符串格式的),这是linux尊从的一种守则,与windows有明显的区别。在这种基调下,很少出现二进制文件,出现的大部分就是机器语言的可执行文件,或者那种库文件。在linnux中规定,bin/sbin夹下方的都是那种可执行的文件。这与lib中的文件不同,lib是库,虽然也是二进制机器代码,但是它是不能自主执行的,是需要通过其他代码的应用执行的。

系统程序通常放在 /bin /sbin下面, s的区别就是超级管理员才能使用的程序。

应用程序则放在/usr下面。

 

程序所要关联的文件,包括include(开发的时候需要引入的),lib编译连接的时候需要应用,bin是编译结束后的可执行程序的载体。

如果,不使用动态链接,那么只需要bin,加上了动态链接则需要lib。include文件在开发编译之后不必存在,所以你会发现在更目录下,通常只有bin/sbin,lib而没有include。因为,设计到系统支持的东西,也不会有太多编程的情景。

 

那么在/usr文件夹下,程序所需要的东西就分布的比较完整。

/usr 全称unix software room (可能准确)。也就是说usr这个文件夹下面放的是在linux之上的一些软件,我们统称为应用软件(有时候也不是,其实系统软件和应用软件的界限本来就不明确,我们可以理解为,usr下装的是那些在一个基本的操作系统之上的一些软件)。这样,你就可以明白linux文件目录中,为什么有好多地方有bin ,include,lib等等。

 

linux是在开源思想下形成的,所以,对于一个软件,linux的哲学是,它应该有源码的(src)、应该附有编程接口的(include,lib),当然也不能缺一个可执行程序的基本的东西(bin,lib),而实际上,window所秉承的商业软件结构,就基本上只会有bin和lib两个东西。这就是区别:

所有在/usr 这个linux系统专门用来放应用软件的文件夹下面就有:

/usr/bin /usr/sbin /usr/include /usr/lib /usr/scr这些文件夹(当然还有其他的一些东西)。

 

我们还有一个特殊的文件夹/usr/local

local里面的结构基本和/usr里面的差不多,这是怎么回事,虽然我不能确切的知道local的作用但是,许多有经验的人都告诉你,如果你自己进行源码编译安装软件的话,就尽量放在local下面的体系中。

 

那么原因是什么?很简单,/usr这个文件夹就是用来转载一起linux上跑的应用程序,在它的下层目录中,规整的放置着程序的各个部分。也就是说程序与程序之间并不是分开放的,而是拆开放在各个容器中。但是,这并不是硬性的技术要求,只是这样的管理让整个系统更加清晰,具有很强的扩展性。

而通常用户自己来源码安装程序(不是通过yum,apt-get来安装),很难做到这种很好的放置,所以,linux系统很人性的开辟这样一个空间,让你来放你想要放的程序,结构依然是标准结构,但是,在这里乱放,不会影响/usr下面的那些程序的正确组织。

 

lib

我们知道lib跟bin一样是程序执行的必备要素(可能是),所以再根目录下(基层系统程序),在/usr,/local中都有它的存在分别是

/lib, /usr/lib , /usr/local/lib

 

include

主要分布区域为:

/include /usr/include /usr/local/include

原创粉丝点击