Win7 Console C语言学习环境搭建(二)

上一篇中的介绍遗留了几个没有解决的问题,想要完善我们的CLI模式学习环境,主要有三个问题需要解决:

1.Vim的基本配置

        这个部分我不会多讲,主要原因是自己也是超级菜鸟,我们在Windows Console 窗口下安装好的Vim,你直接打命令进入后是“白板”形态,打开C语言源程序时没有语法高亮显示。因为系统中并没有相应的 Vimrc 配置文件,我在这里主要谈谈这个文件的创建与存放位置的问题。

2.Make工具问题

        我们前面在 \MinGW\bin  目录中复制了 mingw32-make.exe 文件并重命名为 make.exe ,此时,如果你在模拟DOS的 Windows Console窗口下输入命令 make  。然后你会看到如下出错信息……

make: *** 没有指明目标并且找不到 makefile。 停止
image

        出错原因除了没有指定目标程序文件名称外,另外一个原因是 \MinGW\bin 目录下没有配置 makefile 文件或 Makefile 文件—— make 命令自动搜索的目录与文件,或者当前目录下没有这两个文件,当然你也可以用参数 –f filename 自己指定需要的 makefile 文件(你按自己的需要编写好的 makefile 文件)。 Linux 系统下很多软件的安装似乎都有相应的 makefile 文件,我想应该是指编译安装开源软件时的主要需求。因此解决的方案是写一个 makefile 文件放置在 \MinGW\bin 目录下。

  • make命令默认按照顺序搜索当前目录下的:GNUmakefile、makefile、Makefile
    所以你的makefile可以命名为以上任意一个名称。但是不建议命名为 Gnumakefile 因为它只为 gnu make 使用。

    写好makefile后,在makefile所在目录下执行make命令就可以了。

3.在Win 7 上设置CS50环境(呵呵,其实这才是我的终极目标热烈的笑脸

……偶尔看到了网易的公开课项目,看到这个课程,CS50;来自哈佛大学的授课者 David Malan 十分有趣,在课堂上将“计算机科学”这课上的生动活泼。不是科班出身,所以打算从头看看。其实除了这个网站,他们自己有两个官方网站,一个是cs50.tv.有兴趣的可以去看看。

【以上引用来自- BillyYu - C++博客的文章“在Ubuntu上设置CS50环境”http://www.cppblog.com/BillyYu/archive/2011/01/14/138492.html

在仔细研究的文章提供的方法后,我才开始了在 Windows 7 命令行模式中的尝试,在此特点表示感谢!

  • 下载并配置CS50
image
image
  • 下载地址:library50-c-4.zip
  • 建立CS50文件夹,放置解压缩得到的2个文件:CS50.h 和 CS50.c
  • CS50文件夹下再建立三个子文件夹:include(存放CS50.h),lib(存放libcs50.a), src(存放CS50.c[参考了Ubuntu系统中 /usr/local/  下三个文件夹结构]

        其中,lib文件夹中libcs50.a文件如何得到?研究了BillyYu的方案后,我去 \MinGW\bin 目录下看了看,发现了 ar.exe 文件!编译cs50 lib,并拷贝相关文件至\CS50\相应目录下。现在,我们终于有了属于“自己的”用户自定义库了!所用的命令参考如下:

    gcc -c -ggdb -std=c99 cs50.c -o cs50.o

    ar rcs libcs50.a cs50.o

  • 编译包含用户自定义库的C程序

        我想模拟公开课CS50中出现的那些程序,并希望在我的Windows 7 环境下,只要“make prog就能实现自动编译文件的目的。我尝试编写了一个极简单的,使用了CS50库的程序,make的结果让我失望……不成功!

image

        出错信息提示说找不到cs50.h这个头文件!根据对make的粗浅了解,我把找错的第一步放在了解决GCC编译时,寻找用户自定义库的路径问题上!然后再解决makefile的具体编写问题!或者再解决automake过程的问题。如果我们用GCC来进行编译 hi3.c 文件,你会得到类似的出错信息:

image

        所以,make时出现的这个错误,就是GCC过程中的错误啦……,那么,如何解决这个问题呢?GCC –I 参数寻找 .h ,而–L 参数寻找 .a (-lcs50 类似 –lmath);让我们尝试一个个地加入这两个参数。回忆一下,我们存放 CS50.h 和 libcs50.a 存放路径,然后我们开始实践:

image

        看到了吧?加入参数和路径后,错误解决了……但是又有新的问题了,提示说找不到 –lcs50 。我们知道,-l 参数是连接特定的库文件,如 –lstd或 –lmath 等,因此我们再加上相应的路径:

image

        加入新的参数及库文件路径后,可以成功进行编译了!

【注意及备忘——有事离开,暂时不能尝试了……】

1、使用环境变量能否解决路径寻找问题?

2、如果可以配置让GCC自动寻找,那么我们如何定位这两个文件? 放在MinGW\bin 目录下的 include 或 lib 目录中呢还是更外层?或者是需要对GCC进行某种设置?比如GCC有一个自己的配置文件?

【昨日有事离开,未完。今日接着测试并记录……】

  • 设置GCC的环境变量

        那么,如何让GCC自己主动找到自定义头文件与库文件的路径?我想GCC文档或许有说明,在网上搜索看到一篇介绍文章:“GCC使用”by Jian Lee 链接地址http://jianlee.ylinux.org/Computer/C/gcc.html#sec2 根据文章介绍提供的信息,我想在Windows下可以设置相应的GCC环境变量,如 C_INCLUDE_PATH = E:\cs50\include  和 LIBRARY_PATH = E:\CS50\lib 。前者用于解决寻找头文件(像 cs50.h ),后者用于寻找连接库文件的寻找(像 libcs50.a )。以下是环境变量设置完成后进行的测试,证明这是成功的做法。

image

        差不多可以完成了,但是我们不仿再 make 看看?

image

        难道我总犯同样的错误?是不是 make hi3 后面加上参数“ -lcs50 ”就行了呢?当然不行!因为它是 GCC 的参数,而不是 make 的!好吧,我得说,我猜想是到了解决 makefile 文件编写问题的时候了!可是我想起来在网上看到 make 单个C源文件时,make 会用“隐含规则”自动推定来完成编译工作,也许不用 makefile 文件?还是存在有一个 automake(我不确定是不是这样表达) 什么的设定?

【小结——我先不 make 了】

      GCC在编译时如何去寻找所需要的头文件:

  • header file的搜寻会从指定的参数路径 –I 开始
  • 然后找gcc的环境变量C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
  • 再找内定目录 :
    Windows Linux
    • 你存放GCC的目录,如E:\MinGW\bin\include
    • /usr/include

    • /usr/local/include

    • /usr/lib/gcc-lib/i386-linux/2.95.2/include

    • /usr/lib/gcc-lib/i386-linux/2.95.2/http://www.cnblogs.com/http://www.cnblogs.com/include/g++-3

    • /usr/lib/gcc-lib/i386-linux/2.95.2/http://www.cnblogs.com/http://www.cnblogs.com/i386-linux/include

  • 但是如果装gcc的时候,是有给定的prefix的话,那么就是
    • /usr/include
    • prefix/include
    • prefix/xxx-xxx-xxx-gnulibc/include
    • prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include

       GCC在编译时如何去寻找所需要的库文件:

  • 编译的时候:gcc会从指定的参数路径 -L 去找
  • 再找gcc的环境变量LIBRARY_PATH
  • 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

还可以参看这篇文章:如何指定GCC的默认头文件路径  http://benquike.blog.163.com/blog/static/23546019200911180048892/?fromdm&isFromSearchEngine=yes

原文地址:https://www.cnblogs.com/shudibo/p/2859103.html