Dev-Cpp/Mingw32 环境介绍

http://wxjiao.blog.hexun.com/1945078_d.html

 

 

Dev-Cpp/Mingw32 环境介绍 [转贴 2005-12-30 14:37:51]  

我顶 字号:

文章来源: 点击查看原文:Dev-Cpp/Mingw32 环境介绍

Dev-Cpp/Mingw32 环境介绍(1)

 

前言


  对于现在越来越多得关于编程方面得问题和商业公司对版权问题的担心。所以向各位推荐一款类似于VC的IDE。这款IDE所使用的编译程序是 GCC的Win32版本 Mingw32。而IDE本身也是GPL协议的产物。所以,不论是商业用户,还是个人用户都能够自由的使用她,而不必为使用盗版软件而提心吊胆的。另外,由于Mingw32是GCC的Win32版本。所以,也为Win32的程序员可以了解一下Unix和类Unix下的编程感觉。而且,Mingw32对Win32函数的支持也是很不错的。希望,我们的Mingw32之旅可以带给你快乐。

介绍


  有关Dev-Cpp的介绍,我在这里不想多做解释。因为下面会具体的介绍和讲解的。我在这里只是想要介绍一下有关GCC的内容。因为,Dev-Cpp所使用的Mingw32是一款GCC编译器。所以,对GCC的了解有助于使用Dev-Cpp。

gcc.exe
  这是一个C语言的编译器,负责编译C语言。这个也许大家都知道。不过,在这里我要先向大家说明一下。gcc只是一个C语言的编译器。不能识别C++代码。所以,以前所说的gcc可以编写C++是一个误传。因为,我们通常所说的GCC不是gcc.exe而是GCC的一套程序。其中就包括可以编译C++语言的g++.exe

如果,你不确定这个gcc的版本,可以用如下的命令查看。

gcc -v

关于编译,gcc可以通过命令符编译。

gcc source.c -o binary

以上的命令,是让gcc直接由.c代码编译成可执行代码。
也可以这样。

gcc -c source.c -o code.o
gcc code.o -o binary

这样就生成了一组二进制代码,然后在通过二进制代码生成可执行程序。

g++.exe
  刚才已经说过了,这个是一个用于编译C++代码的程序。基本用法和gcc一样。所以这里不再介绍了。只是让各位了解一下,这个程序是编译C++代码的。

gdb.exe
  用于调试程序的。功能非常强大。可以调试C,C++等语言。据说还可以调试Java程序。不过我没有试过。对于gcc/g++编译出来的程序。需要再编译时加上 -g 参数。gdb才能进行调试。有点像VC的debug。

make.exe
  这是一个非常有用的程序,可以用来发布程序和编译复杂关系的代码组。其实有点像提示符版的安装程序。不同的是,安装程序是一段二进制执行代码,而它是一个文本文档。
  make所执行的是makefile文件。文件是一个文本文档,里面包含了程序的编译规则。如果要用提示符调用的话可以用如下方法。

make -f makefile

然后,make会根据makefile所提供的编译关系进行编译和安装。下面是一段makefile的内容。请注意,其开头的空白是 tab。

release : main.o
 gcc main.o -o main
main.o : main.c
 gcc -c main.c -o main.o

然后,通过命令 make -f makefile release 就可以执行了。
make会根据文件的创造日期来判断是否要对main.o进行重新编译。也就是说,make可以知道作者修改了哪些文件,并将修改过的文件重新编译。再连接成程序。这样有助于开发者节省开发周期上的时间和精力。

好了,希望上面的介绍能让各位满意。在此,我只介绍一些主要的程序,不一一介绍其他的了。接下来我们介绍一下gcc生成的文件。

*.o 其实就是VC生成的*.obj
lib*.a 就是VC中用的*.lib静态链接库。只是,每个库必须用lib开头。在调用的时候,只要提供*的内容就可以了。
*.so 虽然在Win32中很少用,几乎不用但,还是介绍一下。这个就是Win32中的*.dll动态连接库。但是,在Ming32中已经支持dll了。

好了,关于gcc的介绍就到这里。下面我们开始进入正题。

 

第一章 安装Dev-Cpp


  在这里,我不介绍Mingw32如何安装。因为Dev-Cpp中已经包含了Mingw32。如果您想了解Mingw32如何安装,可以查看其他相关的资料。这里不作阐述。
  首先,我们必须下载一个Dev-CPP的安装程序。Dev-Cpp的官方网站是
http://www.bloodshed.net。Dev-Cpp的网页是http://www.bloodshed.net/dev/devcpp.html最新版本应该是Dev-Cpp 4.9.9.0它的下载地址是 http://umn.dl.sourceforge.net/sourceforge/dev-cpp/devcpp4990setup.exe 。这个下载的文件中包含了全部的内容。在得到安装程序以后,我们就来安装了。
  不论如何,我想,安装这种小问题,我想不用再一步步介绍了吧。毕竟我们都是程序员,如果,连安装都不会那真是……。不过,如果在安装中有什么问题,可以提出。我会尽力帮你解决的。
  双击安装程序后,就按照平常安装的方式安装,建议按照默认安装。当然安装的路径就算便你了。在第一次安装以后,程序会提示你界面的设置。如果你喜欢英文就选择English。如果喜欢中文的,就选择Chinese。注意不要选择Chinese(TW)除非你安装了繁体中文。并喜欢繁体中文。然后是图标设置。推荐你使用New Look。如果你喜欢其他的也可以。还有就是是否使用XP风格。这些都随便你了。
  好了就介绍到这里,到此。我已经介绍了Dev-Cpp的安装,如果顺利。你们运行以后,就会看到如下的界面。

  接下来介绍一下,有关Dev-Cpp在windows中的设置。由于GCC有很多的东西是要在提示符下进行操作的,特别是为Dev-Cpp安装,编译一些工具包。所以,我们就Mingw32添加到系统命令中,有助于以后方便调用。
  方法很简单,右键单击 我的电脑。然后选色属性。使用 高级 选项卡。点击环境变量按钮。点击 Path 项,点击编辑按钮。然后将DevCpp安装目录中的bin目录的路径添加到这个选项值的后面。注意,使用 ; 分隔。确定后启动命令提示符。输入 gcc -v 看。一切都好了。现在你就可以像在Linux环境下一样在Win32环境下编译程序了。

至此,您的Dev-Cpp环境就算弄好了。下面我们将介绍如何制作程序。

 

第二章 新建项目与编译


  本章我们要进行实战训练了。介绍一下如何在Dev-Cpp下进行项目新建和编译。我相信你一定会慢慢喜欢上这个编译环境的。
  点击文件菜单,选择新建,点击工程。在出现的对话框中选择你所需要的程序种类。如下图所示。

 

 

  其中,Windows application是Win32图形界面。Console Application是Win32控制台程序。Static Library是Win32的静态连接库。DLL是Win32的动态连库。Empty Project是更具已有的项目类型创造一个新的项目类型。下面的内容是选择使用的语言,如是C语言还是C++语言。还有就是项目名称。这个名称将作为程序编译后的可执行程序的名称。
  在这里为了方便叙述,我们就新建一个Console Application项目好了。至于使用的语言,就随便你了。我这里就用C语言为例了。点击确定后,提示项目保存的路径,建议您选择其他路径不要使用默认的路径,因为默认的路径是安装目录。如果放在那里的话,会很混乱的。在其他目录中,新建一个文件夹(当然不新建也可以,只是这样便于管理)将项目保存在那里。然后,在点击保存按钮(这个按钮就是一张磁盘,和Windows里的一样)或者从文件菜单中选择保存或者Ctrl + S。这些都可以。这样,Dev就会提示你项目中默认文件的保存目录。通常名为main.*。选择一个路径,保存就好了。(建议和项目文件保存在一起)

  下面我们就来编译程序了。点击工具栏,第二行,第一个彩色的按钮。就进行编译了。这时会出现一个编译窗口,显示编译的进度。你可以通过环境选项来设置它。在编译完成后,点击第二个白色的按钮,就可以运行程序了。是不是很方便?我也是那么觉得。

  接下来,我就来介绍一下,有关项目目录内的文件的作用。

main.c 程序的C语言源代码。
main.o main.c的二进制代码。
Makefile.win 就像我上面所说的,这个是项目的Makefile文件。用make命令可以编译程序的。
*.dev *的内容视你项目的名称所定。这个是项目文件,用于记录你对项目的设置。有关文件内个字段的作用就不做介绍了。
*.exe 你所生成的可执行程序。

最后,我介绍一下如何不用IDE来编译生成程序。
首先进入您项目所在的目录。然后用如下命令。

make -f makefile.win all

就可以编译了。当然,也可以直接通过编译源代码来实现。具体的方法,我已经在开头介绍过了。这里就不再重复介绍了。

 

 

文外音:
 
文章就暂时介绍到这里,以后还会继续介绍。有关Dev-Cpp/Mingw32更多的内容以后会一一为各位展示。敬请期待。
另外,还希望各位多多指教。我的格言:不论是程序还是思想,唯有通过不断的交流才能愈加完善。

 

STUDIO 软件开发组

北斗星君(黄庠魁)

Dev-Cpp/Mingw32 环境介绍(2)

上文回顾:


  上文(《Dev-Cpp/Mingw32 环境介绍(1)》)我们知道了该如何安装和使用Dev-Cpp。并且,知道了一些有关Mingw32的一些用法和一些有关程序的介绍和使用方法。学会了一些基本操作的方法。如新建项目,编译项目等。这一次,我们将继续上一次的内容。

第三章 为你的Dev-Cpp安装开发包


  对于许多程序员来说,让一套喜欢的开发包和一个自己喜欢的IDE结合在一起是最高兴不过的了。自然我也是。上一次我们了解了在Dev-Cpp中如何新建项目。但是,美中不足的是,她似乎只能新建一些简单的程序。比如 控制台程序,动态连接库,静态连接库等。似乎要完成一项复杂的工作有些困难。当然,C/C++语言是一门鼓励代码重用的开发语言,我们可以对每个新建的项目进行设置,从而使用自己喜欢并习惯的开发包。但是,这或许太过于繁琐了。而且,安装,编译这些开发包的文件也太过于麻烦了。所以,Dev-Cpp也就为各位开发者提供了 包 的概念。
  在Dev-Cpp中有一个包管理系统。使用这个系统,你可以方便的安装各种开发包。有了这个,你的Dev就会越来越顺手。那就像《人月》中的一篇文章的标题《Sharp Tool》(锐利的工具)那样了。下面我们就来一步步学习如何安装开发包。
  首先,我们必须有一个已经做好了的开发包。我们可以从Dev-Cpp的官方网站获得。这里是开发包的下载页面的地址
www.bloodshed.net/dev/packages/index.html 在上面你可以找到很多你熟悉的工具。当然,如果没有也有和你喜欢的工具类似的工具。如果,你觉得这些工具太古来了,或者还不够。在页面的下方就有一些镜像站点的地址。通常,这些镜像的内容要比主站丰富许多。所以,你可以从很多途径得到这些包。现在我们就随便下载一个作为演练。如果你不建议,我们就下载一个Fast Light Toolkit。当然,你也可以下载其他包。我这里只是作为讲解。
  在下载完成以后,我们将会得到一个后缀名为 *.DevPak 的文件。这个就是开发包文件。这个文件的使用和我们平时使用的安装文件一样。不同的是,安装文件会修改注册表,将安装信息些进去。如果系统重新安装,就需要重新安装程序。而这个安装文件不会将安装信息写入注册表。并且,只要安装程序的目录没有删除。下次安装的时候,就不许要再安装了。除非使用的Mingw32过新或者过旧无法支持。现在,我们好好的保存这个文件。
  接下来话分两头,我们来介绍一下 Package Manager 这个程序你可以用两种方法启动。一种是点击Dev中的工具菜单,选中最后一项的Package Manager。另一种方法是到安装目录中,直接运行 Packman.exe 。运行以后你就会看到如下的一个界面。

如果,你运行以后没有看到左侧的工具栏或者上面的工具栏。你可以在View菜单中将其中的选项全部选上就可以了。下面介绍有关操作的一些方法。其中,Install按钮是用来安装开发包了。而Verify按钮是用来检查开发包的完整性的。而Remove按钮是用来删除开发包的。这个界面中间空白的部分是显示开发包图标的,左侧的工具栏是用来显示开发包信息的。其中包括开发包的名称、版本号、介绍和提供的站点等信息。上方的工具栏是用方便用户操作的。基本上菜单中有的。工具栏上都有了。所以,普通的工作工具条就可以完成了。

  好了,到这里。我们的话再说回来。所谓言规正传,大概就是派这个用场的吧。(怎么突然想到鲁迅先生的《阿Q正传》呢?真奇怪。)我们介绍一下安装包的方法。
  安装工具包的方法有两种,当然是我常用的两种。至于有没有其他方法。自然也有。只是我个人还是比较喜欢这两种。如果哪位有什么比较怪诞的方法自然也可以用。只要能够顺利使用,用什么方法都是可以理解的嘛。所谓条条道路通罗马嘛。有些时候,我们不必过于计较方法,我们要的是结果。
  第一种方法,就是像我们平时使用安装程序一样。直接双击那个工具包。Package Manager 会很热情的跳出来帮你完成任务的。然后,你就更具提示一步步的走就可以了。这种方法的确很不错。只是觉得用起来不够专业。如果被人看到,会被别人认为是菜鸟的。所以,我这里为大家隆重介绍第二种安装方法。首先你先运行Package Manager 然后点击Install按钮。她会提示你告诉她工具包的位置。只要选择好工具包,点击确定。剩下的就和第一种方法一样了。这种方法看起来会比较老鸟一点。不过太麻烦了。不是么?那么是不是我们要在菜鸟和老鸟种做选择呢?当然不用。我个人意见是,平时就用第一种方法。有人请教什么的,就用第二种方法。
  好了,安装好以后。我们会看到Package Manager中会多一个图标。这个就是你刚才安装的工具包。如果觉得用起来不爽就选中她然后按Remove就可以了。
  下面你可能会问我,我安装完了。改如何用呢?问的好,值得表扬。这个问题嘛……当然是很简单的啦。要是连这个也不能回答我怎么能在这里说,你在那里听呢?(诶,原本想早点说完回家睡觉的……)对于不同的开发包,使用的方法会有所不同。如果是IDE自身的开发包。那么,你在使用IDE的时候IDE会在运行时调用的。就不用你操心了。要知道,一个人操心太多会多很多皱纹和死很多脑细胞的。而一些开发工具就可以在新建工程中看到,至于具体在哪里要看具体的包而定。
  接下来我还是以Fast Light Toolkit为例。来说明包的使用方法。Fast Light Toolkit是一个GUI开发包。(我想你该知道什么是GUI吧,说的简单一点就是Graphical User Interface。说得复杂一点,就是用户界面)好了。我们现在开始新建一个工程,这个在上文中已经介绍过了。不过这次在确定项目的时候有些改变。这次,我们在点击新建工程后出现的对话框中,选择GUI选项卡。然后选择FLTK。因为FLTK是用于C++的。所以,我们这里只能用C++而C是不可选状态的(怎么有硬来的感觉)。接下来的一切和上次我们说好的一样了。Dev会自动生成一个main.cpp的文件。里面有一些基本的代码。保存后编译,运行。可以看到一个你仰慕以旧的Windows界面。(啊,终于看到你了,窗口)我想,那么聪明的你应该会举一反三,知道其他的工具包如何使用吧。所谓,师父领进门,修行靠自身。我也不可能一步到位啊。
  最后,我想请你们注意一下。在安装包之前,先要看清楚有关包的说明。因为有些包是有依赖关系的,必须在安装某个包之后再安装她。这就像,要知道有些时候同样的结果是不能将操作的顺序颠倒一样。比如,你必须先有个妻子,然后才有个儿子。(除非特殊情况)

第四章 工程的导入与导出


  四这个数字总是不太吉利。在中国是这样,在国外好像也这样吧。既然我们不能跳过四,直接到五(因为那样,别人会认为是不是自己漏看一章而觉得遗憾终生的)所以,我就在这章介绍一些无关痛痒的东西。就算不吉利也不会影响到我们开发的。
  对于用惯VC开发的人。有许多项目在Dev下开发还要重新在设置和编写,会觉得很头痛。所以,Dev就在她的里面加了一项将VC6.0的工程文件转换成Dev的工程文件的功能。(这句话好绕口啊,下次把它改成绕口令算了)是个好消息吧。
  首先,我们必须有一个VC6.0的工程做测试。没有也没有关系,看看长长见识也不错。反正这章讲的是不关痛痒的内容。接着,我们开始导入了。选择文件,导入,导入Visual C++ Project。点击后,会出现一个对话框。在第一个选项选择*.dsp的路径(填入也可以,只要你能把完整路径写出来)。选择完毕后。对话框就会出现有关该项目的一些属性。你只要选择就可以了。比如,第二个框内的内容就是问你是导入那种生成配置。Debug或者Release还是其他什么的。第三个框内问的是你要将Dev的项目文件放在哪里。(当然是在你自己的计算机上,还有哪里?难道让勇气号带到火星上不成?)全部选择好以后就可以了按确定了。在等待一段时间后(具体长短,要看你的程序体积如何,如果像VC编写的Linux Kernel。那么是要等一段比较长的时间。如果有的话)。现在开启Dev项目看看。怎么样,一切正常吧。是不是很兴奋?或许有人要问,这么重要的功能为什么说是无关痛痒的功能呢?其实,更具我使用下来的情况。导入的代码能够成功编译的,算是你幸运的要准备去买六合彩了。因为,直到现在我还没有导入过一个可以成功编译的项目。(如果你可以,记得一定要告诉我,好让我见识一下传说中的可导入工程)。
  下一个功能是导出。这个功能当然不像上一个功能那么那样。不过,功能对于一般的开发者不会有太大的用处。你可别以为这个导出和上面的导入是相对的。就是把Dev工程导出成VC6.0工程。这个导出,是讲C/C++的文件工程导出成网页形式。或者写字板形式的。如果你是像用这个工程做教程的确实是一个很不错的功能。不过,开发者还是编写代码大于写教程吧(好像我是个不务正业的开发者)。所以,我认为这个功能是有些无关痛痒。下面介绍一下使用方法。
  选择文件,导出后,会有三个选项。到HTML,到RTF和工程到HTML。第一个和第二个是对单个文件进行导出。而第三个是对整个工程进行导出。(就是所有的代码)第一,第二个的导出文件我也不用介绍了。反正也就那么一个文件。我具体的介绍一下第三个所生成的文件。第三个生成了一个*.html,*的内容是由你决定的。和一个名位code的文件夹。里面包含了转成html文件的程序代码。当然,这些代码都是有色彩提示的,很不错。这样看来,所谓的导出工程,其实就是将整个工程文件转换成一个类似于网站树型结构的功能。所以说,这个功能用于说明代码是很不错的。
  好了介绍到这里,介绍了一些无关痛痒的功能。我想,你们也许也对Dev-Cpp有一个大概的了解了吧。如果,你想知道更多的关于导入和导出的功能的介绍。可以提出来。大家一起来解决嘛。

 

文外音:


文章就暂时介绍到这里,以后还会继续介绍。有关Dev-Cpp/Mingw32更多的内容以后会一一为各位展示。敬请期待。
觉得这次的文章,好像没有上次那么有含金量,而且写作风格也有所改变。如果你喜欢这种风格我以后会多运用,如果不喜欢请你说出喜欢那种风格的。我会作为参考的。
另外,还希望各位多多指教。我的格言:不论是程序还是思想,唯有通过不断的交流才能愈加完善。

 

STUDIO软件开发组

北斗星君(黄庠魁)

Dev-Cpp/Mingw32 环境介绍(3)

上文回顾:


  上文《Dev-Cpp/Mingw32 环境介绍(2)》向各位介绍了一些有关Dev-Cpp的功能,其中有包的安装和一些小功能。希望能得到你的满意。这次,我们就继续介绍Dev-Cpp的其他功能。其实,说句实话。对于GNU的东西,我个人觉得还是提示符下用的舒服。我也不知道为什么。有很多功能,在提示符下很简单的打几个字符,可以完成像Windows的IDE需要点很多鼠标才能完成的功能。我说这个并不是没有道理的空穴来风。本次我将为你展现我这一观点。

 

第五章 在Dev-Cpp下的程序调试

 

  对于任何程序员来说,程序的调试是再需要不过了。如果没有程序调试,那么程序的稳定又从何说起呢?现在我们就来看看如何使用Dev来调试我们亲爱的程序吧。
  众所周知,GNU有一个非常棒的调试程序GDB,可是由于常常使用VC。所以,对于这个许多人都有所而闻而未目睹这一程序的芳容。现在我们就来掀开他的盖头来。首先,我们超常,启动Dev-Cpp这次我们要做的是在Dev-Cpp下调试程序。在Dev-Cpp下,调试程序并不像在VC下那样有专门的程序界面来做。他的调试界面就在代码框的下面。只要选择下面的 调试 选项卡就可以看到调试界面了。
  在各位看到调试界面后,会不会有一种凄凉的感觉?其实我已经凄凉了好几年了。大家也就将就一下了。其中调试选项卡中还有三个选项。调试,回溯,输出。其中,调试就是将一些调试的命令做成按钮,方便各位操作。不过我个人觉得这个功能说方便也不方便。因为有些时候就是很简单的一个操作也会让使用的人手忙脚乱的。回溯,是将GDB调会的有关函数的信息显示出来,这个功能还不错。输出,是将用户的GDB命令直接输出给GDB程序,没有按钮了,不过这个界面有个不太好的地方,就是显示GDB返回信息的窗口太小了。有种管中窥豹的感觉,很不舒服。
  话说那么多,觉得有些罗嗦。各位是不是手痒痒了?(该不是小儿多动症吧?)现在随便开启一个程序,最好是代码行数多点的,参数多点的,函数多点的,提示符界面的程序。因为,这个可以帮助你们了解基本的运行机制嘛。
  点击调试窗口的调试按钮,如果你的程序没有调试信息,那么Dev会提示你是否重新编译程序加入调试信息。选择是。然后程序将使用Debug方式重新编译连接程序。在完成之后。我们就开看看自己的程序吧。首先,我们先要运行GDB。在次点击调试,或者将编辑区的光标移动到你要运行到的位置点击运行到光标。然后,程序就开始运行了。其中,你会看到在编辑区中有一个蓝色的条子。这个就指示你该程序运行到何处了。如果你愿意,可以继续向下运行一行。你只要点击 下一步 就可以完成。对于其他有关GDB的操作,比如代码的查看,变量的查看,函数的信息等等,只有通过输出来完成了。选择输出,然后在输出中的字符输入框中输入你的GDB命令。比如:list 这个命令将在下面的字符框中列出程序的代码。当然,你要上下找找,因为框太小,看起来很麻烦。
  好了,有关IDE中的调试,本人就介绍到这里。在深入的东西,当然也没有深入的东西了。再深入的话,怕我没有累死,大家可要看着烦死了。其实上面介绍的一些操作如果再提示符下很容易就Ok了。更本不需要那么复杂。我想,可能这也是Dev不能流行的一个主要原因吧。因为界面的操作太不人性化了。

 

第六章 在提示符下的程序调试


  上一章中,我们领略了Dev-Cpp下的调试。真是让人有些不感恭维。接下来我们来欣赏一下标准,经典的GDB调试。如果各位对Linux等系统有所了解的话,应该知道提示符是许多经典软件的常用界面。所以,要使用一些经典的东西,看来还是要在提示符下多熟悉熟悉了。当然,这里的提示符并不像各位想的那么麻烦,要有上百条命令要记忆。其实,像GDB这样的程序,基本就是一个很简单的命令就可以解决了。而且非常灵活。
  接下来我就来介绍一个GDB的调试。
  首先我们必须要一个可以调试的代码。现在我们用gcc main.c -o main -g来生成可调试的代码。然后用gdb main 来启动gdb。是不是没有想象的那么复杂啊?如果顺利您会看到一段GDB的版权信息,接着是(GDB)这样一个提示符。现在您就可以对GDB下命令了。
  看看程序代码。如果,我们想看看调试程序的源代码而又不想开启main.c这个文件(更多的原因是要为后面设置断点等来做铺垫)。那么我们可以输入list或者,l就可以查看程序代码了。是不是啊?看来提示符并没有像我们想象的那么可怕。
  运行程序代码。虽然调试是可以那么我们该如何在调试的时候运行代码呢?很简单。输入run或者r就可以运行了。如果前面设置过断点,那么使用这个命令可以让程序运行到断点。
  为调试设置断点。使用break可以设置断点,让调试程序在断点停止运行的程序。break 后面必须有一个参数。参数可以是行号。如,break 10 就是在第10行设置断点。也可以是函数名称break main就是在main函数处设置断点。
  查看程序变量。如果您像查看程序中的变量,可以用paint或者p命令来实现。这两个命令后必须加上变量名称。如 p argc就是显示argc的值。而使用info命令可以查看相关的信息,如内存位置什么的。
  一步步运行程序。如果您像在断点后一步步的执行程序,可以用n或者next命令来执行下一行代码。
  退出调试。输入q退出程序。

  是不是觉得提示符下的调试要比IDE中的简单?你不要以为这就是GDB的全部功能。我在这里只是为各位展示一下GDB。如果各位要了解更多的关于GDB的使用方法。可以查看技术手册或者到网上寻找相关的文章,可以找到很多。
  最后,如果对于GDB和调试程序有什么疑问,我们可以一起探讨。


文外音:


这次的文章好像很短,我也觉得。但是,没有办法。所谓众口难调。这一章总是要讲的。干脆提早一些写好。下一篇我们将进入项目的建立和静态库的使用。我想一定会让你感到兴奋的。最后,希望你能够多多指教。我的格言:不论是思想还是程序,唯有通过不断的交流才能愈加完善。

 

STUDIO软件开发组

北斗星君(黄庠魁)

Dev-Cpp/Mingw32 环境介绍(4)


上文回顾:


上文《Dev-Cpp/Mingw32 环境介绍(3)》向各位介绍了有关使用GDB调试程序的简单方法。本文我们将会看看Mingw32如何来使用静态连接库。虽然本文出炉的时间的确是有些慢了点。不过我想各位应该能够理解的。

第七章 在你的程序中使用静态连接库


  在Windows中也许各位都会熟悉以obj和lib结尾的文件。这些文件就是Win32下的二进制文件和静态连接库。但是在Mingw32下有些特殊,我原来在第一章介绍过的。他们是o和a。很奇怪吧。不过我们这里只要知道如何使用就可以了。关于更多的不在本文的范围内。
  我们先以VC为例,各位知道在VC中使用静态库,要在连接程序的时候选择导入的静态库。参数为静态库的全名。比如winmm.lib但是在Mingw32下有些不同。你所使用的参数为 -lwinmm这个就可以了。而-lwinmm的意思是导入静态链接库libwinmm.a。是不是有些想不通?下面我们来介绍一下在Dev中的使用和意义。
  首先我们启动Dev,新建一个工程。然后选择工程->工程属性。(如果你使用New Look图标,那么工程属性就是一个盾型图标。)然后,选择参数选项卡。在连接器的文本框中输入你要的参数,如-lwinmm。至于分割符,可以使用空格,也可以使用回车。不过我个人推荐回车。如果顺利,你的界面看起来会像下图。


  当然你如果要使用*.lib可以,只要将文件名直接填入就可以了。就像 winmm.lib。当然如果用绝对路径也可以。
  下面我们来看看静态连接库的格式。当然,我们不是从文件格式去分析,而是从调用格式看。通常静态库的文件名为 lib*.a其中*表示的就是任何字符。而在我们调用的时候,不需要将所有的文件名都用上,只需要使用*的内容就可以了。就像调用libwinmm.a的静态库我们只需要在连接的时候加参数 -lwinmm就可以了。前面的lib和后面的.a都不需要了。如果,还不太明白。可以看看dev安装目录中的lib目录。里面有很多win32下的静态连接库。自己分析一下文件名和调用方法就会很清楚了。
  最后我们实战一下静态连接库的使用。
  写什么好呢?写一个控制台上的音乐播放器吧。当然只是简单的播放音乐而已,而且路径不支持中文。这里只是为了熟悉一下静态库的使用。
  新建一个控制台工程,然后我们在main.c的代码中写如下代码。

//main.c
#include <windows.h>
#define MAX 255

int main(int argc, char *argv[])
{
    if (argc == 2)
    {
        char filename[MAX];
       
        strcpy(filename, "open ");
       
        strcat(filename, argv[1]);
       
        strcat(filename, " alias media");
       
        mciSendString("close media",0,0,0);

        mciSendString(filename,0,0,0);

        mciSendString("play media",0,0,0);

        system("pause");
    }
    else
    {
        printf("play.exe musicfilename");
    }

    return 0;

}
//main.c end

然后我们在工程属性的连接器参数中输入 -lwinmm 好了。开始编译。如果顺利,我们的程序就会编译成功。并且可以播放一些常用的音乐文件。高兴吧。

好了,这章我们就到这里用这个例子结束了。

问外音:
由于本人最近比较忙,所以原来的两章一文改成了一章一文。请原谅。下一章我们将介绍如何建立Mingw32的静态连接库。敬请期待。并且希望各位能够多提意见。因为不论是程序还是细想唯有通过不断的交流才能愈加完善。

 

STUDIO软件开发组

北斗星君(黄庠魁)

 

Dev-Cpp/Mingw32 环境介绍(5)


上文回顾:


上文《Dev-Cpp/Mingw32 环境介绍(4)》我们介绍了如何使用 静态连接库。今天我们介绍如何制作自己的Mingw32的静态链接库。至于Win32下的那种静态连接库我想熟悉Win32的人应该很清楚如何制作。所以我们这里就不做介绍了。

 

第八章 制作自己的静态链接库


  这是第八章,八这个数字很多人都喜欢。我也一样。(感觉好迷信啊。)这一章我们要来制作静态链接库,我相信各位一定会很高兴的。
  首先我先简单介绍一下静态链接库的作用。我们知道,C/C++程序生成目标代码的过程有,编写代码,编译代码,连接代码,生成目标代码。在连接代码的时候,会将编译后的二进制代码连接成目标代码。但是,有些时候。我们想让程序导入必要的代码,而不想导入无用的代码到我们的程序中。我们该如何呢?很简单,使用静态连接库。使用它我们就可以实现将在程序中使用的函数导入的目的。
  下面我们来一步步的学做静态链接库并且学会如何使用。
  我们现在先写一段代码,你可以用Dev也可以用记事本也可以用任何你喜欢的文本编辑器。像我就比较喜欢vi或者emacs作为平时的文本编辑器。话说远了,现在言规正传。我们写下下面的代码。

//HelloWorld.c

#include <stdio.h>

void HelloWorld(void)
{
        printf("Hello World");
}

上面那段C代码各位应该很熟悉的吧,那么经典的Hello World好让我怀念啊。保存为HelloWorld.c以后我们就开始生成了。
首先,我们先编译HelloWorld.c

gcc -c HelloWorld.c -o HelloWorld.o

这样我们得到一个二进制的文件HelloWorld.o

接着我们生成静态库。

ar cqs libHelloWorld.a HelloWorld.o

这样我们党额静态链接库就好了。如果有需要可以将其他的二进制文件名加HelloWorld.o的后面将他们连接成一个静态链接库。另外,生成的静态库文件名必须为lib*.a

好了,现在我们来使用我们的库吧。

接下来,我们为了能够使用方便,写一个如下头文件。

//HelloWorld.h
void HelloWorld(void);

接着我们开始使用我们刚才生成的静态库。写一个main.c的文件。

//main.c

#include "HelloWorld.h"

int main(void)
{
        HelloWorld();
        return(0);
}

使用gcc编译,假设我们这里所有的文件都保存在同一个目录下。

gcc -c main.c -o main.o

然后我们连接程序。

gcc main.o -o main.exe -L"./" -lHelloWorld

如果顺利我们会得到一个main.exe的文件。

在控制台下输入main.exe或者main就可以出现 Hello World 这组单词。

看了上面的文章是否很兴奋想要生成自己的静态链接库?其实,我个人觉得mingw32生成静态链接库要比VC生成的简单。不知道你有没有这样的感觉。

当然,如果你要在Dev下使用静态连接库,也是可以的。方法我在上一章已经说过了。只是,如果你要使用自己的库必须设置路径。

只要在连接器参数中添加 -L"你的库的所在的文件夹" 或者 将你的库保存到Dev安装目录中的lib目录中。

好了,本文就介绍到这里。如果有什么问题,可以在这里留言。

问外音:


这篇文章其实我真的很喜欢,不是文章喜欢,而是内容很喜欢。不知道各位如何想。这里介绍了一个生成静态库的方法,感觉比VC生成的要简单。其实在gcc的Linux平台下生成动态连接库还要比VC下生成不知道要简单多少倍了。如果说Win32中用于开发最好的平台是win2000那么,在那么x86系统中用于开发的平台莫过于Linux了。这章的内容也许对许多的程序员都有些陌生,我实在担心各位会在实践中会碰到问题,所以在这里还是希望各位在遇到困难时多到这里提问。最后还是我的一句名言:不论是程序还是思想唯有通过不断的交流才能愈加完善。(看过《古畑任三郎》么?主角总喜欢在发表观点后,说一句:我是古畑任三郎。感觉我也和他一样了。不过,这的确是一部不错的影片。至少比国内许多侦探片都好,没有额外的剧情,没有你你我我的爱情。纯粹是从一个破案的角度来拍摄的。推荐各位看看。)

 

STUDIO软件开发组

北斗星君(黄庠魁)

Dev-Cpp/Mingw32 环境介绍(6)


上文回顾:
上文《Dev-Cpp/Mingw32 环境介绍(5)》中,我们了解了如何来制作静态连接库。的确,上一片文章至今已经很长时间了。所以,我这次会用更多的内容来回报各位读者的。下面我们就来说说如何制作动态链接库。

第九章 制作自己的动态链接库

  “我没有做梦吧,Mingw32也能做win32的动态连接库?”对你没有做梦,我也没有胡说。下面我简单介绍一些动态库的生成和使用。
  还是老样子,我们来开启Dev-Cpp,然后我们新建工程。选择DLL工程。这个就是我们的链接库。在新建以后,我们会生成一个dll.h和一个工程名.c文件。其中,dll.h中保存的是你动态库的函数。下面我们看看我的文件内容。

//dll.h
#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */


#endif /* _DLL_H_ */

#include <windows.h>

BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}

DLLIMPORT int HelloWorld(void);

//dll.h End

其中我在最后一行加入了自己的函数,HelloWorld。

下面我们来看看我的HelloWorld.c

//HelloWorld.c
#include "dll.h"

DLLIMPORT int HelloWorld(void)
{
    printf("Hello,World!");
    return(0);
}

//HelloWorld.c End

好了,我们就来编译吧。使用Dev的编译命令或者用如下命令。

我们将会得到两个文件。一个libHelloWorld.a,一个HelloWorld.dll。我们使用这两个文件就可以编程了。

文外音:
说实话,这次这篇文章和前几篇文章相比间隔确实有些长了。由于我前一阶段有些忙了,所以,这次为各位读者抱歉了。下面我们要学的是如何使用刚才我们编写的动态库。

第十章 使用自己的动态链接库

上文回顾:
上文,我们介绍了如何生成动态库。下面我们就来使用它吧。

新建一个工程main.c的文件如下

//main.c

#include <stdio.h>
#include <stdlib.h>
#include "dll.h"

int main()
{
  HelloWorld();
  return(0);
}

//main.c End

现在将刚才那个工程中的 dll.h libHelloWorld.a HelloWorld.dll文件复制到你现在工程的目录里。

然后,我们现在开启工程属性。在链接器一栏中加入

-l"HelloWorld"

保存工程后编译。一切成功后,我们就获得了使用动态链接库的方式了。以后我们只要修改链接库的HelloWorld就可以修改程序中的显示。希望这篇文章各位能满意。

文外音:
的确,现在很忙,所以文章的质量也下降了不少。不过还是希望给为能够多多谅解。最近在搞NASM汇编。发现其实Emcas和Nasm确实很不错。非常喜欢。不过,C我还是会追求的。只是,可能以后和各位的交流会少些,但是我还是会用我的文章来使各位获得有关Dev的内容。本系列文章,未完,待续。






STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君(黄庠魁)

上文回顾:
在上一篇中,我为各位介绍了如何制作包文件,和新建一个自定义的工程。下面我按照约定,要介绍wxWidget的安装。本文适合Dev-Cpp和Mingw32编译器的。

第十四章 wxWidget的下载与安装

  这一章我将为各位介绍如何下载安装wxWidget这个GUI开发库。
  首先,我们先要知道,我们是在win32下使用wxWidget的。所以,我们现在要下载的是wxMSW这个开发库。MSW我想你也知道是什么意思。直到这篇文章写出来,wxMSW的最新版本是2.5.3。现在你可以从
www.sf.net上下载,也可以在如下地址下载。http://umn.dl.sourceforge.net/sourceforge/wxwindows/wxMSW-2.5.3.zip。都是一样的。我通常喜欢用umn.dl.sourceforge.net的下载。偏爱吧。还有,wsMSW-2.5.3.zip是一个免安装的wx。而另一个wxMSW-2.5.3-setup.zip是需要安装的。差别不是太打。如果问我,我比较喜欢wxMSW-2.5.3.zip。
  然后,我们就在你的驱动器上建立一个目录叫 wxWidget-2.5.3。并把压缩包里的文件解压到该目录中。注意要全部解压。当然如果你想少解一点(至少我全部都要)你可以解如下的文件夹和文件。不过注意,路径不能更改。否则的话麻烦就大了。(也就是说原来的路径是 build/msw/makefile.vc 你不能用makfile.vc替代)

build/msw/config.gcc
build/msw/makfile.gcc

include/
lib/
src/

还有一个contrib这个目录其实并不是很重要。至少你在平时使用中不会很多的用它。如果需要你可以解开,但是通常只有在需要的时候才会编译。

这样我们的库就算安装好了。当然,如果你是Dev-Cpp的朋友。你可以按照我前面介绍的自定义工程,来设置工程的参数。这里,我们在编译器参数中加入

-I(安装目录)/include/

连接器参数加入

-L(安装目录)/lib/

好了,这章就到这里了。

第十五章 wxWidget的编译与用wxWidget编译程序

  现在我们用cmd.com进入build/msw。如果你按照我在第一章介绍的方式设置了。那么输入

make -f makefile.gcc

让make来编译程序。在一阵狂编之后。我们就算安装好了wxWidget。这是我们就进入demo/bombs/这个目录,输入

make -f makefile.gcc

就可以尝试我们编译的结果了。你可以将提示符出现的编译参数作为链接参数和编译参数给Mingw32使用编译自己的工程。

编译完成后,你会看到在bombs的gcc_debug目录里有一个文件bombs。运行一下,一个扫地雷出现了。(我一直不会玩扫地雷,也许我的智商不高)。也许你会下意识的看看文件的体积…… 哇!你会恐惧的发现这个程序要 12MB 那么大……。你不用害怕,因为这个是调试用的库。所以加入了大量的调试内容。12MB也是应当的。

  好了,现在我们来编译一个小小的wxWidget库。还是一样,我们在编译的时候要使用一个参数。我们在build/msw/下输入

make -f makefile.gcc BUILD=release

好现在,我们就可以得到release的库了。同样,编译一下bombs来看看。进入gcc_release目录,程序一样运行,但是体积却小了N多。如果压缩一下,程序还会更小都不满1MB。

  但是,我们还要更小更小的库。通常,现在网上绝大部分都介绍到上面第二种编译方式,这已经相当不错了。通常只有第一种。下面我就来介绍一下一个比较特别的编译方式。

  如果各位用过MFC就会知道,其实MFC使用的是动态链接库,这样可以加大重复代码的利用率。如果更新主程序就不需要更新动态库的内容了。所以,我下面介绍如何把wxWidget编译进动态链接库中。
  同样我们要进入build/msw/目录。同样用make。输入

make -f makefile.gcc BUILD=release SHARED=1

首先注意大小写,另外,release参数是必须的,否则就会生成那种可怕的恐龙文件。但是缺点是不能对wxWidget进行调试。在一段时间的编译后,我们就会在lib/gcc_dll中得到动态链接库和库文件。如果你想长期使用,就把*.dll复制到 ~/system32/目录中去好了。或者设置PATH值为该目录。接下来我们就来编译bombs测试。输入

make -f makefile.gcc BUILD=release SHARED=1

这次我们会在gcc_dll目录中找到bombs。如果直接运行,你会看到错误提示。当然如果你把动态链接库复制到/system32/目录中就不会看到了。我们把bombs.exe复制到lib/gcc_dll/目录中,运行后,就会看到程序界面。不过……看看体积……我的天,100多KB。够小了吧。我们就用这个开发wxWidget吧 ^_^

下面列出编译器的参数和连接器的参数好让各位创建自定义工程。

编译器参数:
-O2  -DHAVE_W32API_H -D__WXMSW__    -I(wxWidgets)\include -I(wxWidgets)\lib\gcc_dll\msw -Wall -I. -DWXUSINGDLL -I(wxWidgets)\samples -DNOPCH

连接器参数:
-mthreads -L(wxWidgets)\lib\gcc_dll -Wl,--subsystem,windows -mwindows  -lwxmsw25_core  -lwxbase25   -lwxtiff -lwxjpeg -lwxpng -lwxzlib  -lwxregex -lwxexpat   -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lcomctl32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lwsock32 -lodbc32

其中(wxWidgets)代表你安装wxWidget的位置。

好了,这次的wxWidget之行就到这里了。希望你能成功的走过第三步。

文外音:
其实,我早就喜欢用wxWidget了,只是生成的文件实在吓人。所以迟迟不敢再用。后来转用gtk。不过我也研究到底怎么样把wxWidget体积缩小。所以,这次我彻底的缩小了文件体积。真是一大幸事啊。不过,如果你在编译的时候发现任何的问题。可以在我的Blog响应文件的后面提出,最好留下你的邮箱地址,这样我就能以最快的速度回复你。同时希望你能关注我的文章。
http://blog.csdn.net/visioncat/ 。当然本系列文章还没有结束。还在补充中。因为前期很忙,所以几个月没有更新造成了有人误认为我的文章结束了。哈,不好意思。

补充内容:
  从读者的回复中,发现原来本文还是有些地方不很清楚。因此,在这里做一个小小的补充。
  读者提出,是否能给出一个更简单的wxWidget的例子。所以,我在这里给出一个简单的makefile文件和一个main.cpp文件给各位。


#makefile.txt
#这个Makefile是针对使用Dll的wxWidget
#请将下面的wxPath的参数./改成你wxWidget的安装目录
wxPath=./

CF=-O2  -DHAVE_W32API_H -D__WXMSW__    -I$(wxPath)/include -I$(wxPath)/lib/gcc_dll/msw -Wall -I. -DWXUSINGDLL -I$(wxPath)/samples -DNOPCH

LF=-mthreads -L$(wxPath)/lib/gcc_dll -Wl,--subsystem,windows -mwindows  -lwxmsw25_core  -lwxbase25   -lwxtiff -lwxjpeg -lwxpng -lwxzlib  -lwxregex -lwxexpat   -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lcomctl32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lwsock32 -lodbc32

#Makefile结束


//main.cpp
//这个文件是使用Dll的wxWidget的主程序,是一个窗口(空白)

#include <wx/wx.h>

class MainApp:public wxApp
{
public:
 virtual bool OnInit(void);
private:
 wxFrame *mainFrame;
   
   
};

IMPLEMENT_APP(MainApp)

bool
MainApp::OnInit()
{
 mainFrame = new wxFrame((wxFrame*) NULL, -1, "wxWindows");
 mainFrame->Show(TRUE);
 
 return TRUE;
}

//main.cpp结束

 

好了,这次的补充到这里就结束了。




STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君(黄庠魁)

Dev-Cpp/Mingw32 环境介绍(10)

上文回顾:
在上一文中,我向各位介绍了如何使用Dev-Cpp/MinGW来生成wxWidget。我想你们一定是早已经把这个wxWidget做成工程文件了。有关工程文件的制作,请看第十一章。
前一阶段比较忙,所以对于MinGW介绍的更新几乎是停止了(我在研究一些操作系统的写法)。再加上我对于现在文章的发展方向很迷茫,所以也想不出再介绍一些什么。所以也就没有写。如果各位有什么建议,我希望能看到你们提出来。

第十五章 SDL的下载和安装

  对于在Win32下的用户一定会对SDL很陌生,因为你们从来没有听说过。不过对于Linux下的用户就不同了,因为Linux下的跨平台游戏开发工具就是SDL。不过,我这里介绍SDL并不是主张游戏,而已介绍一下MinGW的游戏开发环境。当然,SDL除了开发游戏还有很多其他的用途,我希望你们能善用她。其实,在Win32下的游戏开发不一定只有DirectX。SDL也是非常强大的。当然如果你用的是MS-C,那么你的SDL就是建立在DirectX上了。不过,她的稳定性我可不能保证。因为SDL的官方网站认为,MinGW的这种编译是安全版本……

  SDL是一组包含若干媒体操作的工具库。个人觉得非常不错。你可以从网上免费获得她。你可以从她的官方网站 http://www.libsdl.org/ ,或者我常去的 www.sf.net 上找到她。如果你想在MinGW下制作SDL的程序,那么你必须下载 SDL-devel-1.2.8-mingw32.tar.gz 虽然体积大了点,但是物有所值。不过,如果你只是想运行几个SDL的软件,那么下载一个运行库就可以了,体积小巧。

  当你下载完成后,你已经成功的三分之一了。下面我就要教你如何安装和设置这个SDL了。

  打开你的压缩包,将里面的文件复制到一个新建的目录中,我现在假设这个目录是 (SDL_PATH)。当然,如果你的计算机上没有解压缩的工具,那么你可以从 www.sf.net 上下载GNUWin32中的解压缩工具,tar,gzip。如果你想偷懒,那么可以直接将要所包里的东西直接复制到Dev-Cpp或者MinGW的目录中。并跳过对编译器的设置。

  现在我来说一下文件夹中文件的作用。

test/ 目录中的文件都是一些测试文件,你可以用她来测试你的SDL是否安装成功。所以,你可以在安装设置完成后删掉她,如果你愿意的话。
lib/  目录中的文件是一些库文件,你在开发中必须要使用到他们,所以千万别删。
include/ 目录中是头文件,和lib/中的文件一样重要
docs/ 中的文件是SDL的教程,你可以从中学会如何操作SDL。虽然是英文的,但是还是写的不错的,基本不需要很好的英文基础就可以读懂。
bin/ 中的文件是SDL程序的运行库,在开发中不需要,但是在运行时就有大用处了。

  接下来,我们为Dev-Cpp设置一下环境变量。在你的工程中将 (SDL_PATH)/lib 添加入你的库路径中。将 (SDL_PATH)/include/SDL 添加入你的头文件路径中。这些我都在前面介绍过了。如果你是MinGW的话,记得在编译的时候添加哦。

  对于项目,我们除了添加路径,还要为程序链接提供库。具体的参数如下。

-lSDL -lSDL.dll -lSDLmain

  上面是在你链接的时候,让ld从 libSDL.a libSDL.dll.a libSDLmain.a 中抽取函数。

  一切,都设置好了,我们就来编译一个例子看看。

  现在,我们就用test中的一个文件来作测试吧。为了方便各位的理解,我这里就直接使用MinGW了,跳过Dev-Cpp的操作,因为对IDE的操作确实很难说清楚,有时候一大段的内容只说清楚了一个很简单的内容。
 
  我们从test目录中将文件 testwin.c sample.bmp复制到你的工作目录下(我通常会用一个WorkHome来放一些写的程序,这样不会东一个西一个了)。
  在编译前,我们先要对testwin.c做一些小小的修改,用Dev-Cpp打开testwin.c。当然记事本也可以。将开头那段中,#include "SDL.h" 改成 #include <SDL.h>。然后保存退出(下面我们将不用Dev-Cpp)了。
  然后我们写一个MakeFile.txt的文件,用来生成SDL程序。

#MakeFile.txt

all:
 gcc -I"(SDL_PATH)/include/SDL" -c testwin.c -o testwin.o
 gcc -L"(SDL_PATH)/lib"  -mwindows -lmingw32 -lSDLmain -lSDL -lSDL.dll -o testwin.exe testwin.o

#MakeFile.txt End

  最后我们使用命令提示符,在 testwin.c sample.bmp MakeFlie.txt 所在的目录下输入如下命令(但是首先你的系统必须做第一章那样的设置)。

make -f makefile.txt

  如果没有任何问题你就得到了个名为testwin.exe的程序。

  当然,现在你还不能运行她。因为你没有SDL.dll。你现在可以从bin目录中将SDL.dll复制到testwin.exe所在的目录中去了。现在可以运行了。当然,在你运行的目录中会出现两个文件。stdout.txt和stderr.txt。这两个是输出文件。


  你现在可以对test中的一些例子进行编译了。当然,还是要对源码做一些小修改。如果你觉得你以后会经常使用她,那么你就可以将她做成工程文件,便于以后生成。
  好了,直到现在,你对SDL的认识也就成功了三分之二,为什么是三分之二呢?因为还有三分之一的成功路程是你自己在对SDL的了解时走出来的。我不喜欢什么都手把手的教,什么都手把手的学。只有自己学会了,才是真正属于自己的。别人告诉你的那还是别人的。不过我还是很乐意解答你在学习使用中遇到的问题的。

文外音:
其实,我个人还是比较喜欢SDL的。原本想用SDL来做前面对Dev-CPP环境设置的介绍的。不过,后来发现SDL的网站暂时关闭了。所以,不得不用GTK来做介绍。在后面的一文中,我将在次将GTK推上我们的教程中。至于原因,是因为原来的内容只是为了介绍如何设置Dev-Cpp才引入的。下一篇,我是要以GTK为介绍重点。敬请期待。本系列文章还在继续中(也许要等我退休了才能写完吧,不知道这个编译器的公司会不会给我劳务费啊?)。


 STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君(黄庠魁)

 Dev-Cpp/Mingw32 环境介绍(11)

上文回顾:

  在上一篇文章中我向各位介绍了有关SDL的安装和设置。希望各位能够从中受益,按照上次的所说的。这次我们将要安装GTK运行与开发库。当然,这一切都是在Win32下进行的。希望你们能够爱上这个。

第十六章 GTK的下载和安装

  GTK?很多人会好奇,既然有了MFC为什么还要GTK?其实,MFC并不是跨平台的GUI。而GTK可以在多平台上运行。如Linux,Mac。当然,也包括Win32。如果你想让你的程序在一处编写,多处编译的话。GTK是一个非常不错的GUI。
  GTK在前面已经介绍过如何通过安装程序来安装。但是,对于那些比较新的库,可能你们就无法安装了。而且,也不够自由。下面,我就介绍一下如何从GTK官方下载安装GTK的Win32版本。对于GTK的介绍,我想我不用介绍了吧。

  GTK的官方网站 http://www.gtk.org 找到Win32的下载地址。在上到这个网站的下载页面后,你会发现很多下载链接。这些都是GTK的一部分,你可以按照你的需要来下载相映的数据文件。不过,你必须下载如下几个文件,这是必须的。

GLib
libiconv
gettext-runtime
GTK+
atk
Pango

  如果你只是运行的话,就只要下载runtime就可以了,如果你要开发的话,那 还 要下载带有dev的数据文件(注意其中还有一个是源文件)。在这篇文章写的时候,最新稳定的gtk是2.6版本的。

  在下载完成以后,我们就只要压缩到一个目录中就可以了,不过,注意,对于Dev和Runtime要分别压缩到两个目录中,免得混淆。
  在将Dev中的

\include\gtk-2.0
\lib\gtk-2.0\include
\include\atk-1.0
\include\pango-1.0
\include\glib-2.0
\lib\glib-2.0\include

添加为头文件路径

\lib

添加为库文件路径

在链接时添加如下参数
-lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl -liconv
在编译时添加如下参数
-mms-bitfields

这样,我们的GTK 开发库就算安装完成了。

不过,运行的的话就有问题了,还要对系统设置一下。

将bin文件夹和lib文件夹的路径添加入系统Path变量中就可以了。或者,你将lib文件夹内的文件复制到bin文件夹中,只将bin的路径添加为系统变量也可以。(后者是官方网站建议的)。

至此我们的GTK开发环境和运行环境都设置好了。下面给出一组简单的Makefile和例子代码。

#MakeFile.txt
CC=gcc
GTK_PATH=
CFLAGS=-mms-bitfields -I"$(GTK_PATH)\include\gtk-2.0" -I"$(GTK_PATH)\lib\gtk-2.0\include" -I"$(GTK_PATH)\include\atk-1.0" -I"$(GTK_PATH)\include\pango-1.0" -I"$(GTK_PATH)\include\glib-2.0" -I"$(GTK_PATH)\lib\glib-2.0\include"

LFLAGS=-L"$(GTK_PATH)\lib" lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl -liconv

all:
 $(CC) $(CFLAGS) -c gtk.c -o gtk.o
 $(CC) $(LFLAGS) -o gtk.exe gtk.o

#MakeFile.txt End


//gtk.c

#include <gtk/gtk.h>
static void destroy( GtkWidget *widget,  gpointer data )
{
 gtk_main_quit ();
}
int main( int argc,  char *argv[] )
{
 GtkWidget *window;
 gtk_init (&argc, &argv);
 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 gtk_window_set_title(GTK_WINDOW(window),"GTK+ Programe");
 g_signal_connect (G_OBJECT (window), "destroy",
 G_CALLBACK (destroy), NULL);
 gtk_widget_show (window);
 gtk_main ();
 return 0;
}

//gtk.c end

  至此,有关GTK的设置和安装就到这里介绍完成了。由于前面对于设置的内容有过详细的介绍。所以,这里就不做太深入的操作说明了。如果有不明白的,可以在这里提出也可以寻找以前的内容。由于本系列文章有很多地方转载,所以如果您是在转载的网站上查看。那么http://blog.csdn.net/visioncat/上能找到,完整的,最新修正后的文章。同时,你也可以在上面相应的文章下,提出您的问题和建议以得到最直接的帮助。

文外音:
在这篇文章以后,MinGW/Dev-C++ 将进入中级篇介绍了。原本那些只对Dev-Cpp的设置和操作的介绍将基本停止(只在必要时说明)。转而对MinGW和其他GCC的Win32编译器做更仔细的介绍以供您深入使用。我想您也不想总是停留在某个IDE下使用Dev-Cpp吧。其实,Dev-Cpp中的核心编译器就是MinGW。所以,您在中级篇中读到的内容同样能够应用到Dev-Cpp中。有些你可以对Dev-Cpp做一些修改便可以成功使用中级篇的内容。不过,我还是会以MakeFile的介绍为主。就好像我第十五,十六章所展示的一样。不过,内容会更为丰富。敬请期待。


STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君(黄庠魁)

Dev-Cpp/Mingw32 环境介绍(12)

上文回顾:
在上一篇文章中,我们了解了如何在MinGW中设置GTK和使用GTK。从这一篇开始,我我们就要开始进入中级篇了。也就是说,我们主要以MinGW和其他GCC在Win32下的使用为主。而不是如同原来只介绍那些操作IDE,安装组件等。如果说,以前我们是在跑道上,那么现在我们就要起飞了。所以,我们会比较注重以MakeFile来说明程序的配置。同时会带上一些Dev-Cpp的设置。

第十七章 在Win32下安装GCC的过程

  有很多人会问,我们既然有了Dev-Cpp这样简单的安装工具,为什么还要去自己学习如何安装MinGW等GCC编译器呢?不是多此一举么?要知道,从现在开始,你已经是在读中级篇的内容了,你也不想只知道通过安装Dev-Cpp来安装MinGW吧。既然你已经选择了GCC,那么知道如何安装GCC在Win32下的一些变体也是一个中级学生该知道的内容。

  MinGW,我想不用介绍了。因为Dev-Cpp中自带的就是这个。Cygwin,一个在Win32下模拟Unix中断的软件组,其实对于真正的Win32开发来说,Cygwin并不是首选,所以我这里也就省略了。Djgpp,一个可以在Win32下开发16位程序的软件,当然也可以让你的软件在DOS下运行。通过上面的一些介绍,我想各位一定知道,我们要安装的编译器就是,MinGW,Djgpp。

  MinGW的安装,其实非常简单。你可以从 http://www.MinGW.org 上下载最新的版本。不过建议你看仔细了,因为有些还是在测试中的。所要下载的文件如下(默认情况下我所安装的是C语言,而不包括C++,如果需要,只要下载C++的文件就可以了)。

binutils    其中包括ld,as等编程需要的程序组
gcc-core    C语言编译器
mingw32-make-3.80.0-3    Make程序
mingw-runtime    其中包括编译程序的大部分头文件和库文件(不包括Win32API)
w32api    这个里面是Win32 API 的头文件和库文件

如果,你需要其他的比如Java,C++,Ada你都可以从上面的网址中下载到。Good Luck。

下载后,全部解压缩到一个目录中,比如 MinGW目录中。如果存在重名现象,通常都是 许可证等的文件,可以履带掉或者不复制。
因为,这些程序包都是使用GNU的压缩工具生成的,所以。文件名不是zip。你可以用WinRAR来开。或者使用 GNUWin32 的工具来解压缩。
http://www.gnuwin32.org
下载tar程序。
如果你下载的文件是 *.tar.gz那么下载 gzip
如果你下载的文件是 *.tar.bz2那么下载 bz2程序(不推荐这个)

然后,使用命令
gunzip (文件名.tar.gz)
tar -xvf (文件名.tar)

就可以解开了。

其实,这些工具的安装都是非常简单的。我个人比较喜欢那些直接解压缩的工具。这样的话,不会生成什么其他的垃圾文件。


  Djgpp,这个可能对各位比较陌生。这个是在DOS下的GCC。你没有看错。这的确是在DOS下的GCC。你可以在MS-DOS的启动盘上运行Djgpp的程序。你也可以在FreeDOS上的启动盘上做这些。这的确是真的。说起来,Djgpp的安装会比较麻烦。
http://www.delorie.com/djgpp/ 上你可以下载到你所要的文件,这个是Djgpp的官方网站。
在下载的页面上有一个为用你给的参数来为你选择下载文件的页面。你可以更具自己的要求来选择。
我这里,下载的是(时间比较久了,肯能已经很老了)
bnu216b.zip
djdev203.zip
gcc400b.zip
gdb611b.zip
mak3791b.zip
txi48b.zip

将这些文件全部解压缩到一个目录中。然后,为系统设置变量。

DJGPP=(Djgpp的安装路径)/djgpp.env

这样就算安装好了。因为,是在中级篇了。所以,很多东西不会像以前那样一步步的教了。

 Cygwin,虽然前面说不想介绍。但这里还是介绍一下吧。
可以先从Cygwin的官方网站下载setup.exe这个安装程序只是一个网络安装版本。很多东西还是要你从网上下载的。你可以使用他直接从网上下载。也可以自己下载。下面,我介绍一下我的安装方式。
http://mirrors.kernel.org/sources.redhat.com/cygwin/release/
从上面的地址中,获得setup.ini这个配置文件。从而获得依赖性。
下面我从中抽取一段来解释一下。

@ gcc
sdesc: "C compiler upgrade helper"
category: Devel
requires: cygwin ash binutils w32api mingw-runtime libintl3 gcc-core gcc-g++ gcc-mingw-core gcc-mingw-g++
version: 3.4.4-1
install: release/gcc/gcc-3.4.4-1.tar.bz2 46 c616cffee0f344c37fd4e045a7a87054
source: release/gcc/gcc-3.4.4-1-src.tar.bz2 46 c616cffee0f344c37fd4e045a7a87054
[prev]
version: 3.3.3-3
install: release/gcc/gcc-3.3.3-3.tar.bz2 46 c616cffee0f344c37fd4e045a7a87054
source: release/gcc/gcc-3.3.3-3-src.tar.bz2 46 c616cffee0f344c37fd4e045a7a87054

@ gcc是包名。比如这里就是GCC工具。
requires: 是依赖的包,比如 cygwin 你可以通过搜索 @ cygwin 在这个文件里找到这个包的信息。
install:  是安装的文件位置。
source: 就是这个程序的源文件地址(通常我们不下载)。

按照这种方式你就可以然后,你把这些文件按照网站上的目录结构保存好。然后运行setup.exe 使用本地安装就可以了。

问外音:
我不喜欢Cygwin,因为觉得这个东西总喜欢在注册表里做一些修改。
其实,真正深入GCC的编程就会发现,不论是MinGW还是Cygwin或者是Djgpp都是不完全的。所以,近期我准备安装一个FreeBSD玩玩。可能以后就会彻底放弃了这个Windows了。
下一篇文章,我将继续深入介绍 GCC for Win32 环境的内容。对于你们深入了解GCC有很大的帮助。其实,很多人都对GCC有误解,总以为MS-C++如何好。其实,GCC也并不比MS-C++差啊。毕竟GCC是Linux下的一个优秀开发环境,Linux内核等都是用GCC编译出来的。MS-C++能编译出Win32内核么?对了,Win32的内核源文件根本没有,又哪来的编译一说?


 STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君(黄庠魁)


Dev-Cpp/Mingw32 环境介绍(13)


上文回顾:

在上一文中,我们了解了如何在Win32下安装GCC的移植版本。那么,从这一章开始。我们将深入GCC的编程世界。不过,有一点我想说明,那就是:当你越深入GCC,你就觉得Win32下的GCC越不够用。所以,Win32下的GCC作为一个开发应用程序的编译器,那当然是足够了。问题是,如果你要将GCC的潜力全部开发出来。那么你就必须在Unix或者类Unix系统上使用。如FreeBSD就是不错的选择。我最近也要迁移到这个系统下了。


第十八章 GCC下的汇编应用


这一章中,我将向各位展示GCC下的汇编语言。如果,你是计算机科班出身。那么,请你注意了。你不要以为这里的汇编语言你学过。因为,GCC所使用的汇编风格和在高校中学的有很大的出入。一不小心就会出错。


在开始之前,我先介绍一下汇编的风格问题。汇编语言的风格基本分为两种。第一种是Inter汇编语言风格。第二种是AT&T汇编语言风格。前者,是现在国内高校学习的。后者,是GCC所使用的。相对来说,我个人偏好AT&T,因为不会造成不好的编程习惯,而且Linux内核中的汇编部分也是用这种风格写的。

汇编语言的风格,只是一种格式,对执行没有任何的影响。所以,不论你学的是Inter汇编风格,还是AT&T除了编写部分有不同外。其他的知识都是一样的。


AT&T汇编语言风格,与Inter的风格最大的差异是,他们的操作数是相反的。比如,


//AT&T

movb $0x01,%al

movw $0x0023,%ax

这里,我们可以看到。立即数前是 $ 寄存器前是 % 。还有,操作顺序是相反的。这就是AT&T的特点。有关AT&T更多的内容。请到网上查询一下。


下面开始正题。在GCC下使用汇编。因为,我们在中级篇开始,就介绍了许多GCC移植版本的安装。而且,他们的适用范围也不同。所以,在没有特殊的提示前。我们都使用MinGW


//myas.s

.text

.global _myas

_myas:

pushl %ebp

movl %esp,%ebp


movw $0x0001,%ax


popl %ebp

ret

上面是一段汇编代码,在GCC中,汇编代码通常都是以 s 为后缀名的。这段代码只是返回一个1,不接受任何参数。

.global _myas 这是定义 _myas 这个函数名。

其他的,我想就不用介绍了。除了操作数顺序不同。其他的和Inter一样。


//main.c

#include <stdio.h>

#include <stdlib.h>

int myas(void);

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

{

int r;

r=myas();

printf(“%d”,r);

return(0);

}

上面那段代码,就是把myas的参数打印到终端上。是不是很简单?下面我们看看如何在Win32下将这些文件编译出来。

>gcc -c myas.s -o myas.o

>gcc -c main.c -o main.o

>gcc -o main.exe main.o myas.o

这样,我们的代码就算链接成功了。运行一下看看吧。

以上,是在C代码外,使用汇编。在C代码内使用的汇编的方式和平时VC的方式是一样的。使用,

__asm__(“movw $0x0000,%ax\n\t”);

就可以在C语言中嵌入汇编代码了。方便好用嘛。

如何?这样的话,就可以让你的代码运行效率得到很大的提升了。


文外音:

是不是这次的文章好像在结构上好看很多?因为,我原来都是使用写字板编写的。这次使用的是,OpenOffice这个软件。只要将他生成的HTML代码贴到Blog上,就可以了。很方便的。而且,是免费的工具哦。我用的是英文版的,觉得很用着很舒服。

看了中级篇的内容,是否觉得自己有很多不足呢?的确,我们学的东西还很多。不过,当你真正的用GCC时,你就会觉得这些在Win32下的东西有些不够用了。中级篇的内容,将不再是以前那样重点写安装和使用了。而是把重点放在更深一层的应用方面。如果,你觉得在看本文时有什么疑惑,或者想法。可以到我的Blog上发表。

如果,您好转载我的文章。请在文章出处写明,我的Blog地址,以便有疑惑的兄弟们能够及时的提出问题,并得到回答。谢谢。

Blog地址:http://blog.csdn.net/visioncat/




STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君(黄庠魁)


Dev-Cpp/Mingw32 环境介绍(14)


上文回顾:

在上一文中,我们了解了如何在GCC下使用汇编语言。后来,由于个人生活环境的原因所以迟迟没有发布新的内容。当然,我这里并不想说一些不愉快的事情。不过,我没有想到居然中国还会有那么没有道德的人存在。由于,我同宿舍的一个温州人,邀请N个同学通宵看电影,影响我睡眠,造成我睡眠严重不足。更可恶的是对我进行人权侵犯!所以,就没有时间静下心来写东西了。今天刚让事情平息了一些,就想到了我的朋友你,所以马上就献上最新的文章。

第十九章 GCC下编写Python扩展

在这一章中,我向大家介绍一些有关Python语言的扩展编写的基础知识。

如果,你对Python了解了。那么你可以跳过这段,阅读后面的内容。如果不是,那么还是请您耐心了解一下Python吧。Python是一种解释性语言,而且历史悠久。他是跨平台,面向对象,使用C编写,可扩展的。他从设计一开始就是为面向对象设计的。所以,可以说,Python是一种不错的语言。有关Python的更多内容介绍,你可以看看我曾经写的另一篇Python的文章《略谈Python语言》。


Python可以使用C这一可移植的语言来进行扩展。而且,由于是用C写的。所以,扩展的速度可以和静态语言相比。所以,可以说会写Python的扩展可以大大的提高项目的运行效率。当然还有其他的好处。


不过,本文并不是介绍Python的语言的,也不是专门介绍用C扩展Python的。所以,就像我曾经所说的,我本系列的文章只是为你开启一扇扇的门。


下面我就开始我的的主题了。


在开始一切之前,请您先到 http://www.python.org 上下载最新的解释器,并安装。在我写本文的时候,最新的版本是Python 2.4.2 。这里有关Python的安装,我就不一步步的详细介绍了。


开始写程序吧!


首先,我先给出一组简单的Python代码吧。

第一个文件为add.py文件,这个文件将是会被导入的。

add.py

def add(x,y):

return(x+y)


第二个文件为main.py文件,这个文件将是会被执行的。

#main.py

import add

print add.add(256,512)


请将上面两个代码使用指定文件名(大小写也要注意,虽然在Win32下是不分大小写的)写入同一个目录下。然后,使用DOS终端在那个目录下输入 main.py 你将会看到他的输出为 768


下面我简单介绍一下两个代码的意思。

第一个文件中,定义了一个add函数,传入两个参数,分别命名为xy。函数的作用是返回x+y的数值。

第二个文件中,我们首先导入了add.py这个文件,并把他的名字空间放到add空间中。然后,我们调用add中的add函数,并传入256512。而且,最后在终端上显示add函数的返回值。


也许你会问,这不是介绍C的么?怎么又介绍Python了。其实,这个是为后面打下基础。


接着,我们试试用CPython中实现add.py的功能吧。

//add.c

#include <Python.h>


static PyObject* add(PyObject *self, PyObject *args);


static PyObject* add(PyObject* self, PyObject* args)

{

int x=0 ;

int y=0;

int z=0;

if (! PyArg_ParseTuple(args, "i|i", &x, &y))

{

return NULL;

}


z=x+y;

return Py_BuildValue("i", z);

}


static PyMethodDef addMethods[] =

{

{"add", add, METH_VARARGS, "Execute a shell command."},

{NULL, NULL, 0, NULL}

};


PyMODINIT_FUNC initadd()

{

Py_InitModule("add", addMethods);

}


这段代码也许你会觉得有些糊涂,这是什么东西?下面我为你一一介绍。

首先的#include <python.h>是必须被导入的。这个在Python的安装目录的include目录中有。其次,我们定义了一个函数叫add。由于Python中的所有东西都是对象。所以,这里在C中,为了于Python通讯,C传给Python的,Python传给C的都是PyObject这个数据类型。下面PyArg_ParseTuple这一句,是将传入的数据转换成C类型的。Py_BuildValue这个函数是将C数据类型转化成Python的数据类型,并返回他。

接着,我们要告诉Python,我们C中的Python的函数有那些。所以,addMethods这个数据组,就是为了存放这些数据的。这个就是一个列表。最后那个initadd这个函数是在Python导入模块时初始化用的。必须存在。而且,比如以 init模块名的形式在命名。其中Py_InitModule函数,是告诉PythonaddMethods这个列表所定义的内容,加入add这个名字空间中。

最后,我把代码在书写一遍。不过这次,我会用红色的部分标出套路的代码部分,也就是必须需要的地方。

#include <Python.h>


static PyObject* add(PyObject *self, PyObject *args);


static PyObject* add(PyObject* self, PyObject* args)

{

int x=0 ;

int y=0;

int z=0;

if (! PyArg_ParseTuple(args, "i|i", &x, &y))

{

return NULL;

}


z=x+y;

return Py_BuildValue("i", z);

}


static PyMethodDef addMethods[] =

{

{"add", add, METH_VARARGS, "Execute a shell command."},

{NULL, NULL, 0, NULL}

};


PyMODINIT_FUNC initadd()

{

Py_InitModule("add", addMethods);

}


最后,我们来把这个代码编译一下吧。你也许会问,既然是跨平台的,是否对于不同的操作系统,要使用不同的编译方式。答案是否定的。Python自带的编译脚本可以为你完成一切的编译过程。不过,你要在开始要把你的MinGW设置进环境变量中。具体可以看本系列文章第一章到第三章。

下面给出Python编译安装脚本的文件。

#!/usr/bin/python

#setup.py


from distutils.core import setup, Extension


module1 = Extension(name='add, sources = ['add.c'])


setup (name = 'PackageName', version = '1.0', description = 'This is a demo package', ext_modules = [module1])

这段代码是告诉Python如何来组成你的包。首先,第一句#!/usr/bin/python 是在BSD/Linux/Unix下告诉系统使用什么解释器运行代码在Win32下有和没有没什么区别。

Module1=Extension('mytest',sources=['add.c']是定义你第一个要编译扩展的信息。后面的setup函数,就是用来定义包的,其中在ext_modules中就在列表中加入了我们刚才定义的模块信息。这样,Python会更具你给的信息,更具不同的平台,操作系统自动的编译出合适的扩展文件。


dos终端下输入setup.py build -cmingw32 如果没有错误,那么在编译后,你会在build目录中的子目录中找到add.pyd这个文件,这个就是PythonC扩展文件。把第一个例子中的add.py从目录中移除,并删除add.pyc这个文件(这个文件会在Python导入时自动生成,方便下次导入时快速执行和导入)。再将刚才编译的add.pyd放到该目录下。像刚才一样的运行,你看到了什么?和刚才一样的运行结果。对的。我这里的C扩展就是实现了刚才Python所定义的功能。怎么样是不是觉得还有很多不明白?如果你要深入Python的扩展编程,你可以看看Python的参考手册 Python/C API 这部分内容。下面列出一些Extension中一些参数的意义。


include_dirs 定义头文件的目录地址,默认情况下Python头文件目录的地址已经被定义了。

library_dirs 定义了库文件的目录地址,默认情况下Python的库文件目录也被包含了。

Libraries 定义在编译时要使用的库文件名,这个有点像GCC中在-l后面加的参数。


当然,还有其他很多参数。这里只是列出了常用的几个基本参数名和意义。希望我为你开启的门够宽敞。如果有兴趣,可以查看Python的参考手册。相信对你一定有很大的帮助。

好了,最后祝你在学习的过程中一切顺利,Good Luck。并且,希望有什么问题请你尽量提出来。


文外音:

就像我开始所说的,我由于生活环境的因素造成我迟迟没有写新的文章。这一点,是让我刚到非常亏欠于你的。不过,这也是最近一个月没有出文章的原因。前一阶段我也说过了,没有创意了。后来,偶然之间找到了中级篇的指导方向,所以马上就有了新文章的构思。希望我这篇文章能够让你们满意。谢谢你长久以来对我的支持。因为有了你,我才会有不懈的动力写下去。谢谢。如果你有任何的问题请到 http://blog.csdn.net/visioncat/ 上提出你的问题和建议。


STUDIO软件开发组(SDT)
STUDIO Development Team
北斗星君(黄庠魁)

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据您提供的Makefile,这个错误信息是由于在删除目标文件时出现问题引起的。这可能是由于您的Dev-C++环境配置不正确导致的。 在您的Makefile中,您使用了`$(DEL)`变量来执行删除操作。然而,在Windows环境下,删除操作通常使用`del`命令而不是`devcpp.exe INTERNAL_DEL`。 为了解决这个问题,您可以尝试将以下行: ``` DEL = C:\Program Files (x86)\Embarcadero\Dev-Cpp\devcpp.exe INTERNAL_DEL ``` 替换为: ``` DEL = del ``` 这将使用Windows的`del`命令来执行删除操作。 修改后的Makefile如下所示: ```makefile # Project: 项目1 # Makefile created by Embarcadero Dev-C++ 6.3 CPP = g++.exe CC = gcc.exe WINDRES = windres.exe OBJ = main.o LINKOBJ = main.o LIBS = -L"C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/lib" -L"C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/x86_64-w64-mingw32/lib" -static-libgcc INCS = -I"C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/include" -I"C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/9.2.0/include" CXXINCS = -I"C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/include" -I"C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/9.2.0/include" -I"C:/Program Files (x86)/Embarcadero/Dev-Cpp/TDM-GCC-64/lib/gcc/x86_64-w64-mingw32/9.2.0/include/c++" BIN = 项目1.exe CXXFLAGS = $(CXXINCS) -std=c++11 CFLAGS = $(INCS) -std=c++11 DEL = del .PHONY: all all-before all-after clean clean-custom all: all-before $(BIN) all-after clean: clean-custom ${DEL} $(OBJ) $(BIN) $(BIN): $(OBJ) $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) main.o: main.cpp $(CPP) -c main.cpp -o main.o $(CXXFLAGS) ``` 请尝试使用修改后的Makefile重新编译您的项目,看看是否能够解决问题。如果还有其他错误信息,请提供详细的错误信息,以便我更好地帮助您解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值