代码改变世界

window环境变量——心得【转】

2012-11-03 22:49  阿普的博客  阅读(2021)  评论(0编辑  收藏  举报

 

首先Window中有很多乱七八糟的路径变量之类的,归类下来有几类,主要是为了我们分清楚概念,以免搞的糊涂了。

1. Window系统的环境变量:顾名思义,就是系统级别的变量,或者利用我们编程的角度来讲,作用域就相当于全局变量了。

2. Window用户的环境变量:既然有全局的,那肯定就有局部的了,所以这个变量可以当作是局部变量,当然编写程序的时候局部变量的作用域内是可以覆盖掉同 名的全局变量的,这个原理同样是适用这里的环境变量。当然我说的只是在作用域内,默认是用的局部变量(window用户变量),当然作用域外就成了全局变 量的天下,而且全局变量即使是在局部变量的作用域内,也可以用的,在编程中,可以用作用域符号区分,所以这要看程序要用什么变量了。

3. 应用程序自己设置的环境变量:这又更进一步,当然自己设置的,一般先用自己的了。

好 像越说越糊涂啊,呵呵,也许有些人还没有理解什么环境变量呢,就说了一堆废话。给你个最恰当的例子,在windowXP的“我的电脑”上右击鼠标,选择属 性。转到高级选项卡,点击环境变量四个字,然后你就找到什么是系统变量什么又是用户变量了。用户变量就是针对每个用户而言的,如果你的登陆名是 administrator,那么这个里面的变量就是针对你的,你发现你的这俩个变量里面都有很多内容,这些变量实际的作用都是提供给系统和系统以外的程 序使用的。

你在开始->运行里面敲入“cmd”,这个就是window底下虚拟dos,你敲入path,发现显示出来 什么了?一堆路径,恩对了,就是一堆路径,这对路径就是cmd使用的路径,用它来干什么呢?当然是用来找东西了,找文件。比如你写入一个notepad, 你会发现记事本弹出来了。为什么它能找到记事本呢?记事本一般在系统盘的windows/system32底下有,你应该注意到path路径里面有一个诸 如:”c:\windows\system32”,这样的路径,对了,环境变量就是提供给程序来使用的,“cmd”程序就是用这个path环境变量来搜索 notepad这个文件的,当你写入notepad,Enter之后,他就开始按照顺序查找了,先是当前目录寻找,然后是从path变量中提取出第一个分 号前面的内容,然后查找,如果找到结束,如果没有找到继续找。这个只是系统中的一个变量path变量,并不是说系统的变量是path,要分清楚概念。他们 是包含关系,谁包含谁,你应该明白,如果不明白,说明我上面一堆废话等于白说了。最后,你还会发现cmd path的路径会有系统和用户的变量。这也就是说它俩个都用了。(不稀奇,应用程序想用什么就用什么)。

Ok,上面说的那么一堆,都是告诉你环境变量的作用是什么。很明显,是为程序和系统服务的,当他们需要的时候。^_^.

好 现在从简单的说,我们知道java要设置变量,一个是path(我们刚刚提到的的),一个是classpath。Path我们知道,想要随便打开歌cmd 窗口,在任意的路径下都能执行到诸如“java,javac”,这样的命令,就要提供path路径给cmd程序。(注意,是提供给cmd程序,不是别的什 么),所以我们会设置java的bin文件夹的路径到path里面,bin文件夹里面都是java的执行程序(编译器,调试器,反编译等等),其中就包括 java和javac这种程序,当我们打开cmd准备编译程序时候,会写如javac,恩,这个只是程序的名字,后面接个参数,比如文件名,然后cmd就 会根据path路径找到相应的javac程序,然后执行之。那classpath是干什么用的呢?它是提供给java(默认在java jdk的bin目录里面)这个程序用的。因为我们编译好后,会发现有时候生成的文件不止一个,而且有时候生成的文件名也很奇怪,和我们主程序的文件名不一 样。恩java就是这样的,他生成的class中间文件,文件数量是根据源程序中的类的数目决定的,而且文件名和类名是一样的,也就是一个类对应一个文件 了,问题不在这里,而且使用过java的人都知道这个问题。问题在于当我们是用了很多包来管理的,java是如何找这些类名的,如果所有的类都在当前目录 底下,这个好说,因为我只要在当前目录底下写入java 类名,就可以执行了。问题是,当我们引入包的时候,你会发现有很多文件夹子,这个就难办了,你会发现有很多奇怪的错误,它会提示找到什么什么之类的错误, 原因就是引用包的时候(import),有个查找路径,比如说import java.lang.*;java和lang都是指的实际的文件夹,这个文件夹在哪里?这里就用到classpth,从classpath给出的路径中开 始找,先找java文件夹,如果找到,再找lang文件夹,然后就是引用所有的类文件,这样你要的类就找到了,因为一个类都对应了同名的文件夹。 classpath就是这个作用,与其说是提供给java的,倒不如说提供给包的管理机制的,这就看你怎么理解了。它平常是有俩个元素,一个是”.”,即 所谓的当前路径,另外一个是”jre”的路径,这路径底下有java编程的时候用到的一堆库,通常主要的库打包成一个jar文件,所以你看不到java之 类的文件夹,不过你用winRAR打开之后,你会发现里面有这样的文件夹。看来环境变量说到底,就是为了程序而服务的。就是这么简单。说简单也不简单,呵 呵,理解了就简单了,理解不了就是不简单,简单于不简单之间,只是一点之差。

VC的也有所谓的环境变量,它也用到了系统提供 的环境变量。说起来也很麻烦的,所以就放到了后面说了。先说说VC的‘比较’底层的工作原理。VC++ 6 (sp2)之类的软件,都是IDE环境也就是 integrated development environment(不知道拼写的对不对,不过就是这个意思:集成开发环境)。也就是说它只是个GUI环境,为了方便用户编程使用的,而说道它是怎么 来编译程序的,它用的是另外一套比较底层的,基于命令环境的程序。在vc的安装目录里面,一般是先进入vc的目录,会看到一个bin的文件夹,里面就有很 多可执行程序,其中有cl.exe 和 link.exe 这俩个程序是VC编译和连接程序的时候进程调用到的俩个程序。说到底,就是当我们写好程序之后,我们先用cl.exe 来编译源代码为中间文件(.obj),然后link.exe 来链接程序。而平常我们会配置VC工程的一些参数,比如在project菜单里面,有个Setting,我们会配置的一般是link选项卡,这些配置,实 际上就是在cl.exe 或者 link.exe 后面加上一些参数而已。例如 /D "strings"这种引号里面字符串,一般都是提供给程序cl.exe 程序的“宏变量”,也就是相当于在编译前,在源代码里面添加了这些变量先。当你编译完之后,你可以在你的代码工程里面找到一个vc生成的.html网页文 件,双击打开,你就会看到vc是如何调用外部底层编译器,编译及其连接文件的。

好了言归正传,对VC环境配置的情况,一般是 我们要用其它库的时候,才会做,或者当我们编写Dll,lib的时候才会涉及到的。一般情况下我们不需要做什么,毕竟微软做的“傻瓜”化系统,的确够傻 的。呵呵。Vc里面有个配置路径的地方,就是:Tools --> Options... --> Directories 。这个地方就是VC配置环境路径的地方,有几个路径,一个是include路径,一个library路径,和 source路径,常用的就是前俩个,因为至今为止,我都没有用过source路径。(source路径据我推测是当我们跟踪调试的时候用 的)Include路径,顾名思义,就是include包含文件的路径,library路径呢?当然就是找那些真正函数源代码的地方。当然上面说的不是很 明白,下面就找个例子来说。

首先,你要新建个工程了,console模式或者win32模式都无所谓的,好写个最简单的console模式的helloworld吧。

#include <stdio.h>

int main(int argc, char *argv[])

{

printf("Hello World!\n");

return 0;

}

这 个程序我们学过C语言的都知道是什么,我们要说的是看那个 stdio.h那个文件,它使用"<>"来引起来的,上过课程的人都应该知道"<>" ,和双引号的区别,前面的是直接在系统提供的目的底下寻找stdio.h,而后者还会从当前源程序所在的当前路径进行查找。这是老师们说的,我们也记住 了,但至于到底stdio.h在哪里,系统目录到底是什么?我们不知道有几个会想过,当然那些喜欢钻研的人肯定是想过了,但我想70%的人还是没有想过 的。呵呵。好先解决第一个问题,所谓的上面说的系统目录是哪里?是我们上面说的系统变量提供的path目录么?这个问题我之前也不清楚,但是经过我的试 验,发现这里的所谓的include的系统目录,只是VC配置路径include我提供的目录,也就是上面我提到的Tools --> Options... --> Directories ,里面的include的路径。简而言之,就是当我们用了一个<>来include一个文件的时候,VC编译器就是利用它自己的配置的路径最 为默认的查找路径,进行“一级查找”,注意这里已经上面提到的,它的查找只是一级的,什么意思呢?就是不会查找子文件夹,只会查找一层。那我们就该断定 vc里面设置的include路径,其中一个肯定有stdio.h这个文件,到底有没有呢?你要自己去找了。我的路径“D:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\”,这个底下,你会发现一个stdio.h的文件,到底是不是它呢?我们就可以来做试验了,方法很简单,删了 它?No!你删了它你再怎么找回来?当然是是rename就可以了嘛,呵呵,我的做法就是rename stdio.h as stdios.h,这样你再次回到刚才的程序,先build -> clean,然后在编译,发现了吗?系统提示说找不到stdio.h这个文件了。上面的过程只是我用试验的方法得出的,至于它有没有找window提供的 系统变量的path路径,你可以做个试验嘛?怎么做?自己想!然后先不要改回来,把那个文件复制到自己程序的目录里面,更改 #include <stdio.h> 为 #include "stdio.h", 然后将复制过了的文件也改为stdio.h文件,再次编译看看,呵呵,是不是可以用啦?恩,说明老师们说的的确是对的,双引号会找当前目录的文件,但我们 应该进一步的想一下,他是否会找window系统提供的环境变量的path路径呢?通过试验,我给你一个结论,不管是尖括号还是双引号,都不会去找的。放 心了吧现在,没有什么疑惑了吧。呵呵。这个你只是菜鸟初飞了,至于大虾,还远哪。那个library路径是干什么用的才是精华所在。

我 们都应该知道吧,include文件里面是写什么东西,不然不知道,你就打开它看看,研究研究它的源码也是大有好处的,恩。一般.h的文件,都是头文件, 编程规范中也是提到,任何涉及到实现的代码都不要放入其中,它只是用来放宏参数的声明,函数的声明,变量的声明(注意我用的是“声明”,而不是"定义", 一定要区分这俩个意思,定义就是实现了,我们不要在。H文件里面进行实现任何东西!)。还是拿上面的那个程序来说,printf这个函数在stdio.h 文件里面包含了声明(其实stdio.h里面包含了很多头文件,printf只是其中一个头文件的里面的,至于在哪里,自己找)。这样,当我们调用 printf这个函数的时候,我们就要进入printf这个函数体里面去执行代码,那这个printf在哪里呢?Stdio.h只是包含了它的声明,也就 是只是一个函数类型加函数名加函数参数,函数体是没有的,它难道没有代码就可以执行了?当然不是了。它有函数体,他在哪里?