一、 学习过程
下载TC2.0并打开如图:
这是一个集成的C语言环境包,包括TC、dosbox和一些编译工具,很明显这样我无法判断单个程序的功能,也无法区分哪些程序是必须的。
那么为了搞清楚哪些文件是用来解决哪些功能的,我新建一个文件夹C:\minic用来存放已知要解决问题的文件。
避免程序通过设置搜索路径的方法找到不在相同目录的相关文件有两种方法:(1)不让设置的默认路径指向真的包含相关文件的目录。(2)把我们所要研究的系统的所有文件都拷贝到一个不可能是系统设置的搜索路径的目录中。
对于第一种方法,首先要搞清楚程序是怎么设置默认搜索路径的,我想起了在配置java环境时需要在系统环境变量里添加相关路径,这样程序在使用时才会根据这个路径找到安装的jdk,那么我们这里的程序安装时是自动添加环境变量吗?如果是这样,那么只要改变环境变量即可避免查找,但我们不知道在程序查找时是哪个环境变量起了作用。在网上的一篇资料《头文件的查找方式和库的搜索路径》里面有这样一句话:“预设的头文件目录是由编译器自己决定的”,那么也可以通过新建文件夹的方式避免查找。如果不是只通过特定路径查找固定文件而是大范围查找的话,那么就要搞清楚这个搜索的范围是多少,是搜索该文件夹下的子目录,还是搜索所有同级目录,还是搜索整个盘符的文件,还是搜索系统内的所有文件。于是就可以用方法二新建一个文件夹使它不在搜索范围内,课本上新建了D:\tc2.0文件夹,说明这个文件夹不在搜索范围内,但是我的xp虚拟机里只有一个C盘,于是我决定新建C:\tc文件夹看看,如果这个文件夹在搜索路径内的话,实验结果会与资料上不一样。创建结果如图:
把tc.exe拷贝到c:\minic并运行如图:
说明TC没有找到所需的文件,该文件夹果然不在搜索范围内。按确定后发现文件夹中出现了两个新的文件:
将tc的工作路径都清空:
编写simple.c并保存到c:\minic下:
用complie编译显示成功:
在c:\minic\PROJECT中创建了simple.obj:
用tc连接simple.obj显示错误:
原因是:unable to open input file ‘COS.OBJ’:
在C:\minic下没有simple.exe
那么我们就在原目录下找到COS.OBJ放进去,结果出现了下一个错误:
再找到EMU.LIB放进去,结果出现下一个错误:
再找到MATHS.LIB放进去,结果出现下一个错误:
再找到GRAPHICS.LIB放进去,结果出现下一个错误:
再找到CS.LIB放进去,终于成功生成了simple.exe文件:
可知TC连接一个OBJ文件所需的文件是:COS.OBJ、EMU.LIB、MATHS.LIB、GRAPHICS.LIB、CS.LIB。
二、 解决的问题
(1) java等程序是怎么查找jdk等相关文件的?答:通过系统或用户的环境变量里的路径查找。
(2) TC连接obj文件所需文件都有哪些?答:TC连接一个OBJ文件所需的文件是:COS.OBJ、EMU.LIB、MATHS.LIB、GRAPHICS.LIB、CS.LIB。
三、 未解决的问题
(1) TC程序是怎么设置默认搜索路径查找相关文件的?
(2) 为什么TC程序编译c文件不需要其他文件?
(3) TC连接obj文件的过程是什么?相关文件的功能都是什么?
四、 学习感想
我们在面对复杂和未知的事物时,要学会以简单有效的方式来分析。要在TC程序的原目录里找出C语言编译连接所必须的文件是很困难的。那么我们不妨换一种思路,TC主程序肯定是必须的,我们把主程序和外部的联系关闭,再编译运行文件,根据错误提示找出所需的文件。如果最后连接成功,那么我们找到的文件肯定就是必须的文件。这个思路在编程中很常见,我们把别人的程序拿来看,如果一个文件一个文件地看代码来搞清楚功能,那么又费时间又费精力,但是如果从功能实现的角度,我只搞清楚我要实现功能的那部分代码,甚至我只要清楚这个文件的功能和接口,甚至我只要知道这个程序是工程实现所必须的,就已经足够了。有句说佛家的三个境界:第一个是“看山是山,看水是水”;第二个是“看山不是山,看水不是水”;第三个是“看山还是山,看水还是水”。把简单的事物看复杂是要注重每一个细节,把复杂的事物看简单是注重效率,我们在做事情的时候要合理选择做事的方式才能事半功倍,实现最大的价值。