0
标签: GTK+ 软件开发
GLADE/GTK在WIN下的编译
哎,本来了自己是喜欢搞硬件的,偏偏这段时间实习却去了家软件为主的公司,现在成了一个菜鸟级的代码员了,离自己的梦想越来越远了。看来在工作之余确实要拿出时间来搞搞自己喜欢的东西才行。
这段时间在搞QT。为什么用QT呢?呵呵应为项目前期别人用QT编好了,要我接过来,我总不可能拿过来就全部改写吧?再说我现在也还没有那样的能力呢呵呵。QT确实不好,开源的仅限于学习之用,要开发商业版的软件,那可是要付出巨额费用购买商业版的,呵呵在中国也罢,满天飞的D版,谁来管。呵呵反正我是不怎么学习QT的。有QT当然就有相对的GTK呢,呵呵GTK也是刚学,相比以后嵌入式上的编程也用的到,用了开源的库当然要找个开源的IDE啊(当然N 人用GCC+MinGw编呵呵)呵呵,用的多的可能是DEV_CPP了,不过那都是N年前的东西了,最近找了个CODE::BLOKDS呵呵界面美观和 VS差不多的漂亮,而且代码提示功能很全,调试也很到位,可以用多种编译器,呵呵它的好处只要你用GOOGLE一搜就找到了,我就不在这里费口舌了。
首先要下WIN下的MinGw和GTK+,最方便的是到SOURCEFORGE上去找auto MinGW和GTK+ FOR WIN32的包,下下来是可执行文件,一按好就全部OK了,我这里是自己下一个个的Win下的包,一个个解压安装的,安装方法我也不说了到GOOGLE上有很多的,这里解决一个问题,就是:
安装GLADE3后用其画一个简单的文本框,
关于以GLADE3的使用:
引用"简单为美"博客,这里对博主表示感谢
原文地址:http://www.cppblog.com/len/archive/2008/03/27/45548.aspx
Say Hello to Glade
Glade是针对GTK+工具箱与 GNOME桌面开发环境的快速图形界面开发工具.用Glade设计的用户接口以XML的文件形式保存,然后根据需要由程序通过libglade库文件来动态加载.因为使用了libglade库,Glade XML文件能够被C,C++,Java,Perl,Python,C#等等语言所支持.针对其他未涉及的语言的支持也是方便的.
在网上可以见到某些关于Glade的教程,大都是关于Linux平台和Glade 2的,因为原先Glade作为快速开发工具,集成代码生成功能,生成C文件.所以常常有初学者对网上某些教程所提及的"generate"(生成代码)功能表示迷惑,在新版本的Glade-3上找不到对应的功能.
新版本的Glade-3是对原先 Glade代码的完全重写.一个显著的变化就是去除了代码生成功能.这样做是有原因的,即然代码生成功能不被提倡使用,而是更鼓励使用libglade功能.但是如果你真需要代码生成功能的话,它还是可以做为插件来提供的.另一个显著的不同是glade-3设计用来最大化使用GObject的自省机制 (GObject introspection),来使外部工具箱和部件的控制,信号和属性的集成更加容易.
如果看过Say Hello to GTK+的话,可能感觉那样的窗体程序太简单了.那么现在让我们借助Glade弄点儿复杂一点儿的界面吧.首先来瞧瞧Glade长什么样,下图就是Glade在windows下的界面.左边的窗体的小部件选择器,相当于调色板.中间是主菜单,右边的是属性窗体.
点击看大图
现在开始创建一个类似于文本编辑器的图形界面.按照上图标注的顺序,依次添加window部件,vertical box部件,menu bar部件,text view部件和Status部件.vertical box设置三行,它是用来进行界面布局,分割空间用,这是gtk+设计与传统的windows UI设计很不同的地方.后三个部件是放置vertical box中的,最后设计完成图形如下.保存取名为win.glade.如果你感兴趣的话,可以用文件编辑器打开这个文件看看,正如所说的那样,它是一个 xml格式的文本文件.
win
现在我们设置相关的头文件和库文件,编辑一个glade.c文件,添加进以下的代码,运行看看,会出现如上图的对话框.虽然这个对话框什么都不干,但是通过Glade,我们能较为容易地设计界面,而不用通过gtk函数,一个一个将控件实现.
#include <gtk/gtk.h>
#include <glade/glade.h>
int main(int argc, char* argv[])
{
GladeXML *gxml;
GtkWidget *window;
gtk_init (&argc, &argv);
gxml = glade_xml_new ("win.glade", NULL, NULL);
window = glade_xml_get_widget (gxml, "hello");
g_object_unref (G_OBJECT (gxml));
gtk_widget_show (window);
gtk_main ();
return 0;
}
保存为win.glade的XML文件。可以看到顶层的窗口物件被自动命名为window1;在codeblocks中建立GTK工程将main.c文件的内容改为
#include <gtk/gtk.h>
#include <glade/glade.h>
int main(int argc, char* argv[])
{
GladeXML *gxml;
GtkWidget *window;
gtk_init (&argc, &argv);
gxml = glade_xml_new ("win.glade",NULL,NULL);
window = glade_xml_get_widget(gxml, "window1");
g_object_unref (G_OBJECT (gxml));
gtk_widget_show (window);
gtk_main ();
return 0;
}
编译,出现几个错误:
1、#include <glade/glade.h>里面的glade.h找不到
2、glade_xml_new 和glade_xml_get_widget有未定义的参数
(前提是你gtk中有libglade库和libxml2库,如果没有的话去sourceforge上去找到win版本下下来,也可以到MinGW的网站,然后进到Download里面,再找到相应的包下下来解压)
但是在MSYS下进入到项目的目录下,敲入gcc -o glade main.c `pkg-config --cflags --libs gtk+-2.0 libglade-2.0`竟然成功生成了glade.exe文件,运行一看正是那个画好的界面,哦!呵呵看来并不是环境的原因,也不是程序的原因了,应该是codeblocks的设置问题了,继续到网上找答案,没办法中文资料太少了只要到 codeblocks的官方论坛找了。
费率一番周折终于搞定了,呵呵其实很简单,引用论坛原帖:
EUREKA!!!!
adding in Project / Build options / linker/ other options
`pkg-config --cflags gtk+-2.0`
`pkg-config --libs gtk+-2.0`
WORKS !
thank you very much
原来就是把pkg-config的--cflags和--libs参数分开来写就可以了,注意这里是关键,网上很多介绍的方法并没有把它分成两次来写,而是像在Linux里一样写成一行了,写在一个``里面了,那样是不行的。
当然了在Project / Build options / compiler/ other options下面也是要加的呵呵!
2009年3月18日星期三
2009年3月17日星期二
Code::Blocks,更好的跨平台C/C++集成开发环境
Code::Blocks
[编辑本段]
介绍
Code::Blocks 是一个开放源码的全功能的跨平台C/C++集成开发环境.
相比于基于Delphi的Dev-C++共享C++IDE,Code::Blocks是开放源码软件。Code::Blocks由纯粹的C++语言开发完成,它使用了蓍名的图形界面库wxWidgets(2.6.2 unicode)版。对于追求完美的C++程序员,再也不必忍受Eclipse的缓慢,再也不必忍受VS.NET的庞大和高昂的价格。
虽然Code::Blocks从一开始就追求跨平台目标,但是最初的开发重点是Windows 系统下的版本,从06年3月21日版本:1.0 revision 2220开始,Code::Blocks在它的每日构建中正式提供Linux版本(分两个版本:ubuntu.deb和fc4.rpm)。这样 Code::Blocks在1.0发布时就会是跨越平台的C/C++IDE,它将支持Windows和Linux的主要版本。长期以来C++开发员在 Linux没有好用、通用的C++ IDE的局面就要结束。而这个IDE对于Windows下的用户同样重要,由于它开放源码的特点,Windows用户可以不依赖于VS.NET,编写跨平台C++应用。
Code::Blocks提供了许多工程模板,这包括:控制台应用、DirectX应用、动态连接库、FLTK应用、GLFW应用、Irrlicht工程、OGRE应用、OpenGL应用、QT应用、SDCC应用、SDL应用、SmartWin应用、静态库、Win32 GUI应用、wxWidgets应用、wxSmith工程,另外它还支持用户自定义工程模板。在wxWidgets应用中选择UNICODE支持中文。
Code::Blocks支持语法彩色醒目显示,支持代码完成(目前正在重新设计过程中)支持工程管理、项目构建、调试。
Code::Blocks支持插件,目前的插件包括代码格式化工具AStyle;代码分析器;类向导;代码补全;代码统计;编译器选择;复制字符串到剪贴板;调试器;文件扩展处理器;Dev-C++ DevPak更新/安装器;DragScroll,源码导出器,帮助插件,键盘快捷键配置,插件向导;To-Do列表;wxSmith;;wxSmith MIME插件;wsSmith工程向导插件;WindowsXP外观。
Code::Blocks具有灵活而强大的配置功能,除支持自身的工程文件、C/C++文件外,还支持AngelScript、批处理、CSS文件、D语言文件、Diff/Patch文件、Fortan77文件、GameMonkey脚本文件、 Hitachi汇编文件、Lua文件、MASM汇编文件、Mathlab文件、NSIS开源安装程序文件、Ogre Compositor脚本文件、Ogre Material脚本文件、OpenGL Shading语言文件、Python文件、Windows资源文件、XBase文件、XML文件、nVidia cg文件。识别Dev-C++工程、MS VS 6.0-7.0工程文件,工作空间、解决方案文件。
Code::Blocks基于wxWidgets开发,正体现了wxWidgets的强大。以前Borland C++ Builder X宣称基于wxWidgets开发跨平台、兼容性好、最优秀的C++ IDE环境,但没有实现;现在Code::Blocks+GNU GCC正在实现这个理想。让我们拭目以待。国内的Code::Blocks爱好者和跨平台开发员应该尽快建立中文Code::Blocks网站,提供 Code::Blocks中文化支持,促进Code::Blocks在国内的发展。
[编辑本段]
安装
2.1安装Code::Blocks发行版 8.02
8.02版是必须安装的,然后才能升级。
2.11 下载安装文件
Code::Blocks的发行版版本号就是它的发行年月,所以8.02版,就是08年2月份发布的,其实地相当于1.0版。
Code::Blocks网站:www.codeblocks.org 其下载页面(http://www.codeblocks.org/downloads/5)提供了windows,Linux(多个发行版),及Mac OS X 的安装文件或源文件包。 不过我们暂时只讲Windows下的安装。所以您可以将下面的链接,复制到迅雷之类的工具下载。
2.12 卸载可能的mingw32先前版本
Code::Blocks支持多种编译器,但我们主要讲Windows下的mingw32 g++编译器。因此需要安装mingw32。前面下载的安装程序已经自带有完整的mingw32环境。mingw32是g++环境在windows下的一个实现。为了避免版本与路径冲突,最好不要在一台机器上安装两个mingw32。所以本步要求检查一下。
如果您以前有用过Dev C++之类也采用mingw32的IDE,那您最好先卸载了它们。如果您不懂什么叫mingw32,那估计你的机器就是没能安装过吧。那这一步跳过。
2.13 开始安装
双击下载的文件,就可以开始完装了,主要就两个注意点:
第一、选择"Full/完整"安装,免得一些插件没有被安装上。
第二、安装目录最好不要带有空格或汉字。
这一点并不是Code::Blocks的限制,而是因为mingw32里的一些命令行工具,似乎对长目录或带空格的目录支持有点小问题,我估计汉字目录也会出问题,但没试过。一句话,就装在根目录下的X:\CodeBlocks即可。比如我是安装在E:\CodeBlocks下。
2.2 升级Code::Blocks到最新svn版
Code::Blocks是开源的软件,它们源代码管理采用subversion管理,因此它的编译版本就直接采用svn的版本了。
code::blocks的网站看不去不怎么更新,其实程序的主要都在它的BBS(http://forums.codeblocks.org/)的nightly builds子论坛中更新。
2.2.1 下载升级文件,并覆盖原有文件
这里给出同样给出截至今天(北京时间2008年7月20日半夜3点)的最新升级包下载地址:
说明:
1、也许英文不是很好的朋友会觉得英文界面可能会用起来不方便,不过现在网上已经有朋友推出了中文的语言包。
下载地址:http://www.d2school.com/co...
2、Code::Blocks完整安装教程:http://www.d2school.com/co...
3、对于需要调试的朋友要注意,你的projects应该放在全英文的目录中才可以正常的使用调试功能。
下载的是.7zip的文件,可以用WinRAR或开源7zip软件解压全部文件,覆盖原目录下的文件,比如,我需要把它们解压:E:\CodeBlocks\ 目录下。
要持续跟踪最新版本,请关注本网站,或者直接到前述官方论坛查看。
2.2.2 试运行
双击桌面上的Code::Blocks启动图标――如果没有,那就到开始菜单里找找。启动时,能看到一个启动界面,右
下若有显示"svn 5142",那就说明安装及升级成功了。
当然,你也可以在启动完成后,像其他软件一样,到"Help"菜单下找"About"查看详细版本信息。
现在Code::Blocks还是英文界面的,接下来我们谈谈如何安装它的语言包。
2.3 使用本地语言包
首先,请在 X:\CodeBlocks\share\CodeBlocks\ 建立一个子文件夹:locale,注意 locale 全为小写字母。
我对简体汉字的语言包做了较大改进,不过仍然没改完,另外,一些插件在当前版本本来就无法汉化的,所以还有一部分内容是英语的。繁体部分我没有改动。
d2school版Code::Blocks语言包下载。
下载后,请解压到前述的locale目录下,则locale目录下,应出现zh_CN和zh_TW两个子目录。
重新启动Code::Blocks,点击主菜单的"Settings",选择 "Enviornment"。出现的对话框中,左边选中"View",右边打勾"Internationalization (needs restart)",并在后面的复合框中选中"Chinese (Simplified)"。确认退出本对话框。
重启Code::Blocks。再看到的应该是中文简体界面了。
2.4 基本配置 Code::Blocks
一款编程用的IDE,一定要不断根据自己的需要进行配置,才会变得好用起来。不过本文仅仅讲那些必选项。也就是如果没配置好,这个Code::Blocks就干不了活的选项。有关其它的选项,因为太多,我不可能现在就开始写,以后我会慢慢整理一些放在本站。需要的人,请多关注www.d2school.com。主要会是一些常用的快捷键等配置,给不熟悉的人带个头,最终还是靠自己去配置。
2.41 配置g++编译器及调试器
请大家首先到 X:\CodeBlocks\MinGW\bin下,检查一下有没有以下文件:
mingw32-gcc.exe 这是C的编译器。
mingw32-g++.exe 这是C++的编译器,同是地DLL(动态库)的连接器。
ar.exe 这是静态库的连接器。
gdb.exe 这里调试器。
windres.exe windows下资源文件编译器。
mingw32-make.exe 制作程序。
都没有问题,请点击c::b主菜单"设置"(汉化前的"Settings"),这次选中"编译器和调试器设置..."。,出现的对话框中,右边选中"全局编译器设置",然后对照下图,检查左边配置是否正确无误:
现在我们就可以拿Code::Blocks来写课程里的很多C++代码了。
对于Linux的使用者,由于GCC原生于Linux, 所以只需下载Code::Blocks网站的.tar.gz即可。Code::Blocks对Debian系提供了更好的支援。
[Code::Bolcks在Linux下运行]
Code::Bolcks在Linux下运行
Setup of GTK and dev-c++ in Windows(2009)
GTK and Dev-C++的Windows移植(2009)
经过几天的摸索(n次的install/ininstall),终于搞定了gtk+ and dev-c++在windows平台上的安装配置。
网上google来的安装步骤基本是基于2004版的gtk,按照那些攻略或许有用。
下面是一些最新安装步骤和注意事项:
1.download gtk+安装包:http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.14/gtk+-bundle_2.14.7-20090119_win32.zip
2.download dev-c++安装包http://downloads.sourceforge.net/dev-cpp/devcpp-4.9.9.2_setup.exe?use_mirror=nchc
3.gtk解压缩到G:/devtool/dev-cpp(这个是我电脑安装目录,请参考之)
4.dev-c++安装到G:/devtool/dev-cpp(这个是我电脑安装目录,请参考之)(可以或略下面的5、6步骤)
5.运行dev-c++ and create a new gtk project。Codes flowwing:
#include <gtk/gtk.h>
int main( int argc,
char *argv[] )
{
GtkWidget *window;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_show (window);
gtk_main ();
return 0;
}
6.compile and find conpile error:1 G:\Devtool\Dev-CPP\Test\Untitled1.c gtk/gtk.h: No such file or directory. ;
7.配置环境变量I(setx请参考:http://guan-qiao.blogspot.com/2009/03/windossetxexe.html):
setx path "%path%";G:/devtool/dev-c++
8.首先在Windows 下執行Command Mode:
pkg-config --cflagsgtk+-2.0
-mms-bitfields -IG:/devtool/dev-cpp/include/gtk-2.0 -IG:/devtool/dev-cpp/lib/gtk-2.0/include -IG:/devtool/dev-cpp/include/atk-1.0 -IG:/devtool/dev-cpp/include/cairo -IG:/devtool/dev-cpp/include/pango-1.0 -IG:/devtool/dev-cpp/include/glib-2.0 -IG:/devtool/dev-cpp/lib/glib-2.0/include -IG:/devtool/dev-cpp/include/libpng12
pkg-config --libs gtk+-2.0
-LG:/Devtool/Dev-C++/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl
9.配置环境变量II
// setx path "%include%";(上面步骤8中结果的所有路径)
//G:/devtool/dev-cpp/include/gtk-2.0;G:/devtool/dev-cpp/lib/gtk-2.0/include;G:/devtool/dev-cpp/include/atk-1.0;G:/devtool/dev-//cpp/include/cairo;G:/devtool/dev-cpp/include/pango-1.0;G:/devtool/dev-cpp/include/glib-2.0;G:/devtool/dev-//cpp/lib/glib-2.0/include;G:/devtool/dev-cpp/include/libpng12
//setx GTK_BASEPATH g:\Devtool\dev-cpp -m
//setx PKG_CONFIG_PATH=G:\Devtool\dev-cpp\lib\pkgconfig -m
//Dev Cpp 的 undefined reference to `__cpu_features_init'错误的解决
setx LIBRARY_PATH: G:\devtool\Dev-Cpp\lib;G:\devtool\dev-Cpp\mingw32\lib -m
Setx C_INCLUDE_PATH:G:\devtool\Dev-Cpp\include -m
10.restet dev-c++
11.hint:glade
经过几天的摸索(n次的install/ininstall),终于搞定了gtk+ and dev-c++在windows平台上的安装配置。
网上google来的安装步骤基本是基于2004版的gtk,按照那些攻略或许有用。
下面是一些最新安装步骤和注意事项:
1.download gtk+安装包:http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.14/gtk+-bundle_2.14.7-20090119_win32.zip
2.download dev-c++安装包http://downloads.sourceforge.net/dev-cpp/devcpp-4.9.9.2_setup.exe?use_mirror=nchc
3.gtk解压缩到G:/devtool/dev-cpp(这个是我电脑安装目录,请参考之)
4.dev-c++安装到G:/devtool/dev-cpp(这个是我电脑安装目录,请参考之)(可以或略下面的5、6步骤)
5.运行dev-c++ and create a new gtk project。Codes flowwing:
#include <gtk/gtk.h>
int main( int argc,
char *argv[] )
{
GtkWidget *window;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_show (window);
gtk_main ();
return 0;
}
6.compile and find conpile error:1 G:\Devtool\Dev-CPP\Test\Untitled1.c gtk/gtk.h: No such file or directory. ;
7.配置环境变量I(setx请参考:http://guan-qiao.blogspot.com/2009/03/windossetxexe.html):
setx path "%path%";G:/devtool/dev-c++
8.首先在Windows 下執行Command Mode:
pkg-config --cflagsgtk+-2.0
-mms-bitfields -IG:/devtool/dev-cpp/include/gtk-2.0 -IG:/devtool/dev-cpp/lib/gtk-2.0/include -IG:/devtool/dev-cpp/include/atk-1.0 -IG:/devtool/dev-cpp/include/cairo -IG:/devtool/dev-cpp/include/pango-1.0 -IG:/devtool/dev-cpp/include/glib-2.0 -IG:/devtool/dev-cpp/lib/glib-2.0/include -IG:/devtool/dev-cpp/include/libpng12
pkg-config --libs gtk+-2.0
-LG:/Devtool/Dev-C++/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl
9.配置环境变量II
// setx path "%include%";(上面步骤8中结果的所有路径)
//G:/devtool/dev-cpp/include/gtk-2.0;G:/devtool/dev-cpp/lib/gtk-2.0/include;G:/devtool/dev-cpp/include/atk-1.0;G:/devtool/dev-//cpp/include/cairo;G:/devtool/dev-cpp/include/pango-1.0;G:/devtool/dev-cpp/include/glib-2.0;G:/devtool/dev-//cpp/lib/glib-2.0/include;G:/devtool/dev-cpp/include/libpng12
//setx GTK_BASEPATH g:\Devtool\dev-cpp -m
//setx PKG_CONFIG_PATH=G:\Devtool\dev-cpp\lib\pkgconfig -m
//Dev Cpp 的 undefined reference to `__cpu_features_init'错误的解决
setx LIBRARY_PATH: G:\devtool\Dev-Cpp\lib;G:\devtool\dev-Cpp\mingw32\lib -m
Setx C_INCLUDE_PATH:G:\devtool\Dev-Cpp\include -m
10.restet dev-c++
11.hint:glade
2009年3月16日星期一
Windos下用setx.exe命令行模式下永久设置系统环境变量
setx.exe不是系统默认自带的命令,但可以从微软的网站(2K,XP)上下载到,是官方的咚咚,所以可以放心使用。
以下是它的用法,转载的别人的:
※ 来源:.逸仙时空 Yat-sen Channel bbs.zsu.edu.cn.
Setx
在本地或系统环境中设置环境变量,无需编写程序或制作脚本。Setx 还检索注册表项并将其写入到文本文件。
语法
setx [/s Computer [/u [Domain\]User [/p [Password]]]] Variable Value [/m]
setx [/s Computer [/u [Domain\]User [/p [Password]]]] [Variable] /k Path [/m]
setx [/s Computer [/u [Domain\]User [/p [Password]]]] /f FileName {[Variable] {/a X,y | /r X,y "Stri
ng"} [/m] | /x} [/d Delimiters]
参数
/s Computer
指定远程计算机名称或 IP 地址(不能使用反斜杠)。该默认值是本地计算机。此参数适用于在命令中指定的所有
文件和文件夹。
/u [Domain\]User
使用特定用户帐户的权限运行脚本。该默认值是系统权限。
/p [Password]
指出 /u 参数中指定的用户帐户的密码。
Variable
指定要设置的环境变量的名称。
Value
指定要将环境变量设置到的值。
/k Path
指定根据来自注册表项的信息设置变量。指定 Path,格式为 \HIVE\KEY\...\Value(例如,HKEY_LOCAL_MACHINE\
System\CurrentControlSet\Control\TimeZoneInformation\StandardName)。
/f FileName
指定要使用的文件。
/a X,y
指定绝对坐标和偏移量作为搜索参数。
/r X,y "String"
指定来自 String 的相对坐标和偏移量作为搜索参数。
/m
指定设置系统环境中的 Variable。默认值是本地环境。
/x
显示文件坐标。忽略 /a、/r 和 /d 命令行选项。
/d Delimiters
指定附加的分隔符,例如,"," 或 "\"。四个内置的分隔符为空格、跳格键、回车和换行符。可使用任何 ASCII 字
符作为附加的分隔符。分隔符的最大值为 15,包括四个内置的分隔符。
/?
在命令提示符下显示帮助。
注释
使用 /s、/u 和 /p 命令行选项
只有在使用 /s 命令行选项时才可使用 /u 和 /p 选项。必须同时使用 /p 和 /u 才能提供用户密码。
Setx 提供仅用于命令行或编程的方式直接且永久地设置系统环境值。系统环境变量可通过"控制面板"或通过注册
表编辑器 (Regedit.exe) 手动配置。Set 命令为命令解释程序(即,Cmd.exe)的内部命令,仅为当前控制台窗口
设置用户环境变量。
可使用 setx 为来自以下三种来源之一的用户和系统环境变量设置值:命令行模式、注册表模式或文件模式。
Setx 类似于 UNIX 实用程序 SETENV。
Setx 将变量写入到注册表中的主环境。用 setx 设置的变量仅在未来的命令窗口中可用,而不是在当前的命令窗口
。
只支持 HKEY_CURRENT_USER 和 HKEY_LOCAL_MACHINE 配置单元。REG_DWORD、REG_EXPAND_SZ、REG_SZ AND REG_MU
LTI_SZ 是有效的 RegKey 数据类型。
当在注册表中获得对 REG_MULTI_SZ 值的访问权时,只有第一项被展开和使用。
无法使用 setx 删除添加到本地或系统环境中的值。可以使用带有变量名但不带值的 set 来删除本地环境中相应的
值。
REG_DWORD 注册表值将以十六进制的模式展开并使用。
文件模式仅支持对 CR-LF 文本文件的解析。
示例
要在本地环境中设置 MACHINE 环境变量为 Brand1,请键入:
setx MACHINE brand1
要在系统环境中设置 MACHINE 环境变量为 Brand1 Computer,请键入:
setx MACHINE "brand1 computer" /m
要在本地环境中设置 MYPATH 环境变量以使用在 PATH 环境变量中定义的搜索路径,请键入:
setx MYPATH %PATH%
要在本地环境中设置 MYPATH 环境变量以便在将 ~ 替换为 % 后使用在 PATH 环境变量中定义的搜索路径,请键入
:
setx MYPATH ~PATH~
要在一台名为 Computer1 的计算机上的本地环境中设置 MACHINE 环境变量为 BRAND1,请键入:
setx /s computer1 /u maindom\hiropln /p p@ssW23 MACHINE BRAND1
要在一台名为 Computer1 的计算机上的本地环境中设置 MYPATH 环境变量以便使用在 PATH 环境变量中定义的搜索
路径,请键入:
setx /s computer1 /u maindom\hiropln /p p@ssW23 MYPATH %PATH%
要在本地环境中将 TZONE 环境变量设置为在 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZone
Information\StandardName 注册表项中找到的值,请键入:
setx TZONE /k HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation\StandardName
要在系统环境中将 BUILD 环境变量设置为在 HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersi
on\CurrentBuildNumber 注册表项中找到的值,请键入:
setx BUILD /k "HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\CurrentBuildNumber" /m
要在一台名为 Computer1 的计算机上的本地环境中将 TZONE 环境变量设置为在 HKEY_LOCAL_MACHINE\ System\Cu
rrentControlSet\Control\TimeZoneInformation\StandardName 注册表项中找到的值,请键入:
setx /s computer1 /u maindom\hiropln /p p@ssW23 TZONE /k HKEY_LOCAL_MACHINE\ System\CurrentControlSe
t\Control\TimeZoneInformation\StandardName
要在一台名为 Computer1 的计算机上的系统环境中将 BUILD 环境变量设置为在 HKEY_LOCAL_MACHINE\Software\M
icrosoft\WindowsNT\CurrentVersion\CurrentBuildNumber 注册表项中找到的值,请键入:
setx /s computer1 /u maindom\hiropln /p p@ssW23 BUILD /k "HKEY_LOCAL_MACHINE\Software\Microsoft\Wind
ows NT\CurrentVersion\CurrentBuildNumber" /m
要显示文件 ipconfig.out 的内容及其相应的坐标,请键入:
setx /f ipconfig.out /x
要在本地环境中将 IPADDR 环境变量设置为在文件 ipconfig.out 中 5,11 坐标处找到的值,请键入:
setx IPADDR /f ipconfig.out /a 5,11
要在本地环境中将 OCTET1 环境变量设置为在带有分隔符"#$*."的文件 ipconfig.out 中 5,3 坐标处找到的值,
请键入:
setx OCTET1 /f ipconfig.out /a 5,3 /d "#$*."
要在本地环境中将 IPGATEWAY 环境变量设置为在文件 ipconfig.out 中相对于"Gateway"坐标为 0,7 的坐标处找
到的值,请键入:
setx IPGATEWAY /f ipconfig.out /r 0,7 Gateway
要显示一台名为 Computer1 的计算机上的文件 ipconfig.out 的内容及其相应的坐标,请键入:
setx /s computer1 /u maindom\hiropln /p p@ssW23 /f ipconfig.out /x
以下是它的用法,转载的别人的:
※ 来源:.逸仙时空 Yat-sen Channel bbs.zsu.edu.cn.
Setx
在本地或系统环境中设置环境变量,无需编写程序或制作脚本。Setx 还检索注册表项并将其写入到文本文件。
语法
setx [/s Computer [/u [Domain\]User [/p [Password]]]] Variable Value [/m]
setx [/s Computer [/u [Domain\]User [/p [Password]]]] [Variable] /k Path [/m]
setx [/s Computer [/u [Domain\]User [/p [Password]]]] /f FileName {[Variable] {/a X,y | /r X,y "Stri
ng"} [/m] | /x} [/d Delimiters]
参数
/s Computer
指定远程计算机名称或 IP 地址(不能使用反斜杠)。该默认值是本地计算机。此参数适用于在命令中指定的所有
文件和文件夹。
/u [Domain\]User
使用特定用户帐户的权限运行脚本。该默认值是系统权限。
/p [Password]
指出 /u 参数中指定的用户帐户的密码。
Variable
指定要设置的环境变量的名称。
Value
指定要将环境变量设置到的值。
/k Path
指定根据来自注册表项的信息设置变量。指定 Path,格式为 \HIVE\KEY\...\Value(例如,HKEY_LOCAL_MACHINE\
System\CurrentControlSet\Control\TimeZoneInformation\StandardName)。
/f FileName
指定要使用的文件。
/a X,y
指定绝对坐标和偏移量作为搜索参数。
/r X,y "String"
指定来自 String 的相对坐标和偏移量作为搜索参数。
/m
指定设置系统环境中的 Variable。默认值是本地环境。
/x
显示文件坐标。忽略 /a、/r 和 /d 命令行选项。
/d Delimiters
指定附加的分隔符,例如,"," 或 "\"。四个内置的分隔符为空格、跳格键、回车和换行符。可使用任何 ASCII 字
符作为附加的分隔符。分隔符的最大值为 15,包括四个内置的分隔符。
/?
在命令提示符下显示帮助。
注释
使用 /s、/u 和 /p 命令行选项
只有在使用 /s 命令行选项时才可使用 /u 和 /p 选项。必须同时使用 /p 和 /u 才能提供用户密码。
Setx 提供仅用于命令行或编程的方式直接且永久地设置系统环境值。系统环境变量可通过"控制面板"或通过注册
表编辑器 (Regedit.exe) 手动配置。Set 命令为命令解释程序(即,Cmd.exe)的内部命令,仅为当前控制台窗口
设置用户环境变量。
可使用 setx 为来自以下三种来源之一的用户和系统环境变量设置值:命令行模式、注册表模式或文件模式。
Setx 类似于 UNIX 实用程序 SETENV。
Setx 将变量写入到注册表中的主环境。用 setx 设置的变量仅在未来的命令窗口中可用,而不是在当前的命令窗口
。
只支持 HKEY_CURRENT_USER 和 HKEY_LOCAL_MACHINE 配置单元。REG_DWORD、REG_EXPAND_SZ、REG_SZ AND REG_MU
LTI_SZ 是有效的 RegKey 数据类型。
当在注册表中获得对 REG_MULTI_SZ 值的访问权时,只有第一项被展开和使用。
无法使用 setx 删除添加到本地或系统环境中的值。可以使用带有变量名但不带值的 set 来删除本地环境中相应的
值。
REG_DWORD 注册表值将以十六进制的模式展开并使用。
文件模式仅支持对 CR-LF 文本文件的解析。
示例
要在本地环境中设置 MACHINE 环境变量为 Brand1,请键入:
setx MACHINE brand1
要在系统环境中设置 MACHINE 环境变量为 Brand1 Computer,请键入:
setx MACHINE "brand1 computer" /m
要在本地环境中设置 MYPATH 环境变量以使用在 PATH 环境变量中定义的搜索路径,请键入:
setx MYPATH %PATH%
要在本地环境中设置 MYPATH 环境变量以便在将 ~ 替换为 % 后使用在 PATH 环境变量中定义的搜索路径,请键入
:
setx MYPATH ~PATH~
要在一台名为 Computer1 的计算机上的本地环境中设置 MACHINE 环境变量为 BRAND1,请键入:
setx /s computer1 /u maindom\hiropln /p p@ssW23 MACHINE BRAND1
要在一台名为 Computer1 的计算机上的本地环境中设置 MYPATH 环境变量以便使用在 PATH 环境变量中定义的搜索
路径,请键入:
setx /s computer1 /u maindom\hiropln /p p@ssW23 MYPATH %PATH%
要在本地环境中将 TZONE 环境变量设置为在 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZone
Information\StandardName 注册表项中找到的值,请键入:
setx TZONE /k HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation\StandardName
要在系统环境中将 BUILD 环境变量设置为在 HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersi
on\CurrentBuildNumber 注册表项中找到的值,请键入:
setx BUILD /k "HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\CurrentBuildNumber" /m
要在一台名为 Computer1 的计算机上的本地环境中将 TZONE 环境变量设置为在 HKEY_LOCAL_MACHINE\ System\Cu
rrentControlSet\Control\TimeZoneInformation\StandardName 注册表项中找到的值,请键入:
setx /s computer1 /u maindom\hiropln /p p@ssW23 TZONE /k HKEY_LOCAL_MACHINE\ System\CurrentControlSe
t\Control\TimeZoneInformation\StandardName
要在一台名为 Computer1 的计算机上的系统环境中将 BUILD 环境变量设置为在 HKEY_LOCAL_MACHINE\Software\M
icrosoft\WindowsNT\CurrentVersion\CurrentBuildNumber 注册表项中找到的值,请键入:
setx /s computer1 /u maindom\hiropln /p p@ssW23 BUILD /k "HKEY_LOCAL_MACHINE\Software\Microsoft\Wind
ows NT\CurrentVersion\CurrentBuildNumber" /m
要显示文件 ipconfig.out 的内容及其相应的坐标,请键入:
setx /f ipconfig.out /x
要在本地环境中将 IPADDR 环境变量设置为在文件 ipconfig.out 中 5,11 坐标处找到的值,请键入:
setx IPADDR /f ipconfig.out /a 5,11
要在本地环境中将 OCTET1 环境变量设置为在带有分隔符"#$*."的文件 ipconfig.out 中 5,3 坐标处找到的值,
请键入:
setx OCTET1 /f ipconfig.out /a 5,3 /d "#$*."
要在本地环境中将 IPGATEWAY 环境变量设置为在文件 ipconfig.out 中相对于"Gateway"坐标为 0,7 的坐标处找
到的值,请键入:
setx IPGATEWAY /f ipconfig.out /r 0,7 Gateway
要显示一台名为 Computer1 的计算机上的文件 ipconfig.out 的内容及其相应的坐标,请键入:
setx /s computer1 /u maindom\hiropln /p p@ssW23 /f ipconfig.out /x
2009年3月14日星期六
GTK的Windows移植
howroc
04-12-09, 12:23
因为一个朋友的关系,要在windows下编译gtk的代码,我查了一些资料,现在使用的方法如下:
(1) 需要文件:
GTK-Runtime-Environment-2.2.4-3.exe:http://prdownloads.sourceforge.net /gtk-win/GTK-Runtime-Environment-2.2.4-3.exe?download。安装到C:\RunTime_GTK。
GTK-Development-Environment- 2.2.4-3.exe:http://prdownloads.sourceforge.net/gtk-win/GTK-Development- Environment-2.2.4-3.exe?download。安装到C:\Dev-C++.
devcpp4991setup.exe,就是bloodshed的一个IDE环境: 搜索。安装到C:\Dev-C++。
(2)设置环境变量:SET PATH=%PATH%;C:\RunTime_GTK\bin;C:\RunTime_GTK\lib。在98下我直接该了autoexec.bat。
(3)运行Dev-C++,在"工具->编译选项->目录->库",加入:C:\Dev-C++\lib
(4)"工程->工程属性->参数" 或 "工具->编译选项"中的链接器框里面填入:-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
(5)工具->编译选项->目录->C包含文件:
C:\Dev-C++\include\gtk-2.0
C:\Dev-C++\lib\gtk-2.0\include
C:\Dev-C++\include\atk-1.0
C:\Dev-C++\include\pango-1.0
C:\Dev-C++\include\glib-2.0
C:\Dev-C++\lib\glib-2.0\include
(5) 工具->编译选项:
-mms-bitfields
然后可以写一个最简单的GTK程序,显示一个窗口。这没有问题。我又在Linux下用glade生成了一个最简单的工程,在Dev-C++中把生成的.c 和 .h文件加入到一个Dev-C++的C工程中,也可以通过编译(好象add_pixmap_directory()这一行有问题,注释)。但是,我前几天 写的pixbuf和键盘相应的工程却加不进来,总是报告没有定义。
现在的问题是,我当然希望在Linux下的工程能够拿到Windows下直接使用。在Windows下运行Glade无法Build,报告的错误中,是使用的错误的路径,特别是使用斜杠而不是翻斜杠。 不知道在Windows下能不能使用glade.
我还希望在Windows下能够使用Makefile。mingw我也试了一下,但我现在还没有automake,autoconf工具。我想在Dev-C++中先使用Linux下建工程后生成的Makefile,不知道行不行。
(1) 需要文件:
GTK-Runtime-Environment-2.2.4-3.exe:http://prdownloads.sourceforge.net /gtk-win/GTK-Runtime-Environment-2.2.4-3.exe?download。安装到C:\RunTime_GTK。
GTK-Development-Environment- 2.2.4-3.exe:http://prdownloads.sourceforge.net/gtk-win/GTK-Development- Environment-2.2.4-3.exe?download。安装到C:\Dev-C++.
devcpp4991setup.exe,就是bloodshed的一个IDE环境: 搜索。安装到C:\Dev-C++。
(2)设置环境变量:SET PATH=%PATH%;C:\RunTime_GTK\bin;C:\RunTime_GTK\lib。在98下我直接该了autoexec.bat。
(3)运行Dev-C++,在"工具->编译选项->目录->库",加入:C:\Dev-C++\lib
(4)"工程->工程属性->参数" 或 "工具->编译选项"中的链接器框里面填入:-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
(5)工具->编译选项->目录->C包含文件:
C:\Dev-C++\include\gtk-2.0
C:\Dev-C++\lib\gtk-2.0\include
C:\Dev-C++\include\atk-1.0
C:\Dev-C++\include\pango-1.0
C:\Dev-C++\include\glib-2.0
C:\Dev-C++\lib\glib-2.0\include
(5) 工具->编译选项:
-mms-bitfields
然后可以写一个最简单的GTK程序,显示一个窗口。这没有问题。我又在Linux下用glade生成了一个最简单的工程,在Dev-C++中把生成的.c 和 .h文件加入到一个Dev-C++的C工程中,也可以通过编译(好象add_pixmap_directory()这一行有问题,注释)。但是,我前几天 写的pixbuf和键盘相应的工程却加不进来,总是报告没有定义。
现在的问题是,我当然希望在Linux下的工程能够拿到Windows下直接使用。在Windows下运行Glade无法Build,报告的错误中,是使用的错误的路径,特别是使用斜杠而不是翻斜杠。 不知道在Windows下能不能使用glade.
我还希望在Windows下能够使用Makefile。mingw我也试了一下,但我现在还没有automake,autoconf工具。我想在Dev-C++中先使用Linux下建工程后生成的Makefile,不知道行不行。
2009年3月13日星期五
Dev-Cpp/Mingw32 环境介绍(1)
Dev-Cpp/Mingw32 环境介绍(1)
摘要: 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 环境介绍(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软件开发组
GTK+, Qt, wxWidgets 比较简评
GTK+, Qt, wxWidgets 比较简评
//这位台湾的高手把GTK+, Qt, wxWidgets比较分析得相当到位。明显,MFC注定将淡出江湖了。
[心得] 知名 GUI lib 简评 (GTK+, Qt, wxWidgets)
之前因为把 MFC 痛骂了一顿,有网友在询问其他 GUI toolkit
所以小弟分享一下个人对三大知名图形介面 library 的简短评论
纯属个人主观意见,不是业界人士,所知有限,望先进前辈不吝指正或补充
先讲 GTK+
GTK+, Qt, wxWidgets 比较简评
//这位台湾的高手把GTK+, Qt, wxWidgets比较分析得相当到位。明显,MFC注定将淡出江湖了。
GTK+ 主要用在 X Window 上,整个设计的架构和许多概念和 MFC 以及一般 Windows 上
的程式开发大异其趣,入门门槛较高,而且最主要的特色是,他用不具有物件功能的纯
"C" 语言,模拟物件导向。 所以写起来比较复杂艰涩,而且充满大量巨集,使用和除错
都不是很容易,但优点则是可以用 C,不需 C++,如果和 Win32 SDK 比较,不会难学
多少,缺点是不易上手使用,而且文件比较缺,架构又非常复杂,且提供的东西比起其他
无所不包的 library,是简陋了一点,函数命名又臭又长。 对於简单的程式,GTK+ 会
显得太复杂,但是当你开始想扩充其他 library 也都没提供的进阶功能,就会开始赞叹
GTK+ 的架构严谨,还有超乎想像的高度弹性。 同样的东西要用 MFC 来做反而会要人命
并且多国语言的支援良好,内部也全面使用 UTF-8,相容性好,又是 unicode
能够习惯的话,GTK+ 值得推荐,但没有很建议学,毕竟不好学,要用到熟会需要比
较久,而且那样很多 C++ 的功能会用不到。 GTK+ 有 C++ 版本叫做 GTK--,没用过
但看文件觉得,并没有比 gtk+ 简单到哪里去。 因为 gtk+ 本来就是物件导向,所以
即使换了 c++ 语言,写起来架构还是差不多的。 另外,gtk+ 有 Windows 版本,但缺
点是,执行缓慢,不稳定,而且介面是使用 gtk+ 自己的,不是使用 Windows 内建的
"Native" 原生图形介面,看起来会不太习惯。 Mac OS X 下可用 X11 来执行 gtk+
但那样出来的程式是长得像 UNIX 程式,而不是美美的 OS X Aqua 外观
wxWidgets 和 MFC 最接近,命名习惯或架构都高度相似,会 MFC 几乎不用重新学习
有十余年历史,此外,他的物件封装比 MFC 要好,提供的功能也多上太多,又跨平台
一般知名的 MFC 程式都会选择用 wxWidgets 改写,来快速移植原程式到其他平台
例如 eMule 用 wxWidgets 移植出 aMule, xMule, 还在开发中的 Filezilla 3...等
而他最主要的特色是,他是"跨平台"的 "Native" GUI toolkit,在各种平台上都可写出
使用该平台内建 Native 原生图形介面的程式。 在 Windows 上就长得跟其他 Windows
程式一样,在 Linux 下就使用 gtk+ 的图形介面,在 Mac OS X 下就可以使用华丽的
Aqua 外观风格,这点是非常强悍。 不像 gtk+ 到其他系统都还是只能用 gtk+ 自己的
缺点是,中文支援在有些地方会出问题,例如剪贴簿的操作。 得自己 patch
但仍然相当推荐,即使是个庞大的 library,效能依旧不会太差,尤其在 Windows 上
执行速度并不输 MFC,与其学 MFC,不如学 wxWidgets。
Qt 的功能,应该是这三者加上 MFC 之中最强大的,文件也很完整,又有 RAD 工具
可以辅助开发,并且有商业公司做强力后盾。不但有 Windows/X Window/Mac 版本,
甚至还有嵌入式系统可用的版本,稳定性还不错,物件封装也算良好,资源比 GTK+ 或
wxWidgets 多得非常多,而且发行公司提供了相当多范例,算是一家以开放原始码成功
营利的模范公司。 知名的 KDE 整个是用他开发,证明了他的稳定性和强大功能。
缺点是如果你用他开发非 GPL 开放程式码的软体,必须以极昂贵的金额,购买商业
版本。 而他的图形介面并不完全是 "Native GUI",只是透过 theme 去模拟系统上的
标准 GUI,所以看起来很像,却会有些地方可以明显看出破绽。 执行速度缓慢还有过於
庞大则是另一个问题。 虽然封装得很良好文件也齐全,并不代表他就很容易学
还有一个严重问题是,他写的不是标准 C++,他使用的 signal/slot 机制必须透过 Qt
提供的 preprocessor 处理过才可以转送给编译器,这部份可能被限定用 qmake,算是
一个可惜的地方,不过瑕不掩瑜,还是很推荐。忘了说,他内部也是 unicode,
多国语言没问题。
以上三套只是简单介绍,其中 Qt 的程式我没有实际完整开发过,但明显的三套都远远比
只能在 Windows 上用,功能少 Bug 多难学难用几乎无多国语言支援的 MFC 要强。
三套可跨平台的 library 大家可自行选择,只能用在 Windows 的 MFC 就不用考虑了
//这位台湾的高手把GTK+, Qt, wxWidgets比较分析得相当到位。明显,MFC注定将淡出江湖了。
[心得] 知名 GUI lib 简评 (GTK+, Qt, wxWidgets)
之前因为把 MFC 痛骂了一顿,有网友在询问其他 GUI toolkit
所以小弟分享一下个人对三大知名图形介面 library 的简短评论
纯属个人主观意见,不是业界人士,所知有限,望先进前辈不吝指正或补充
先讲 GTK+
GTK+, Qt, wxWidgets 比较简评
//这位台湾的高手把GTK+, Qt, wxWidgets比较分析得相当到位。明显,MFC注定将淡出江湖了。
GTK+ 主要用在 X Window 上,整个设计的架构和许多概念和 MFC 以及一般 Windows 上
的程式开发大异其趣,入门门槛较高,而且最主要的特色是,他用不具有物件功能的纯
"C" 语言,模拟物件导向。 所以写起来比较复杂艰涩,而且充满大量巨集,使用和除错
都不是很容易,但优点则是可以用 C,不需 C++,如果和 Win32 SDK 比较,不会难学
多少,缺点是不易上手使用,而且文件比较缺,架构又非常复杂,且提供的东西比起其他
无所不包的 library,是简陋了一点,函数命名又臭又长。 对於简单的程式,GTK+ 会
显得太复杂,但是当你开始想扩充其他 library 也都没提供的进阶功能,就会开始赞叹
GTK+ 的架构严谨,还有超乎想像的高度弹性。 同样的东西要用 MFC 来做反而会要人命
并且多国语言的支援良好,内部也全面使用 UTF-8,相容性好,又是 unicode
能够习惯的话,GTK+ 值得推荐,但没有很建议学,毕竟不好学,要用到熟会需要比
较久,而且那样很多 C++ 的功能会用不到。 GTK+ 有 C++ 版本叫做 GTK--,没用过
但看文件觉得,并没有比 gtk+ 简单到哪里去。 因为 gtk+ 本来就是物件导向,所以
即使换了 c++ 语言,写起来架构还是差不多的。 另外,gtk+ 有 Windows 版本,但缺
点是,执行缓慢,不稳定,而且介面是使用 gtk+ 自己的,不是使用 Windows 内建的
"Native" 原生图形介面,看起来会不太习惯。 Mac OS X 下可用 X11 来执行 gtk+
但那样出来的程式是长得像 UNIX 程式,而不是美美的 OS X Aqua 外观
wxWidgets 和 MFC 最接近,命名习惯或架构都高度相似,会 MFC 几乎不用重新学习
有十余年历史,此外,他的物件封装比 MFC 要好,提供的功能也多上太多,又跨平台
一般知名的 MFC 程式都会选择用 wxWidgets 改写,来快速移植原程式到其他平台
例如 eMule 用 wxWidgets 移植出 aMule, xMule, 还在开发中的 Filezilla 3...等
而他最主要的特色是,他是"跨平台"的 "Native" GUI toolkit,在各种平台上都可写出
使用该平台内建 Native 原生图形介面的程式。 在 Windows 上就长得跟其他 Windows
程式一样,在 Linux 下就使用 gtk+ 的图形介面,在 Mac OS X 下就可以使用华丽的
Aqua 外观风格,这点是非常强悍。 不像 gtk+ 到其他系统都还是只能用 gtk+ 自己的
缺点是,中文支援在有些地方会出问题,例如剪贴簿的操作。 得自己 patch
但仍然相当推荐,即使是个庞大的 library,效能依旧不会太差,尤其在 Windows 上
执行速度并不输 MFC,与其学 MFC,不如学 wxWidgets。
Qt 的功能,应该是这三者加上 MFC 之中最强大的,文件也很完整,又有 RAD 工具
可以辅助开发,并且有商业公司做强力后盾。不但有 Windows/X Window/Mac 版本,
甚至还有嵌入式系统可用的版本,稳定性还不错,物件封装也算良好,资源比 GTK+ 或
wxWidgets 多得非常多,而且发行公司提供了相当多范例,算是一家以开放原始码成功
营利的模范公司。 知名的 KDE 整个是用他开发,证明了他的稳定性和强大功能。
缺点是如果你用他开发非 GPL 开放程式码的软体,必须以极昂贵的金额,购买商业
版本。 而他的图形介面并不完全是 "Native GUI",只是透过 theme 去模拟系统上的
标准 GUI,所以看起来很像,却会有些地方可以明显看出破绽。 执行速度缓慢还有过於
庞大则是另一个问题。 虽然封装得很良好文件也齐全,并不代表他就很容易学
还有一个严重问题是,他写的不是标准 C++,他使用的 signal/slot 机制必须透过 Qt
提供的 preprocessor 处理过才可以转送给编译器,这部份可能被限定用 qmake,算是
一个可惜的地方,不过瑕不掩瑜,还是很推荐。忘了说,他内部也是 unicode,
多国语言没问题。
以上三套只是简单介绍,其中 Qt 的程式我没有实际完整开发过,但明显的三套都远远比
只能在 Windows 上用,功能少 Bug 多难学难用几乎无多国语言支援的 MFC 要强。
三套可跨平台的 library 大家可自行选择,只能用在 Windows 的 MFC 就不用考虑了
2009年3月12日星期四
QT
Qt (pronounced "cute" by its creators[1]) is a cross-platform application development framework, widely used for the development of GUI programs (in which case it is known as a widget toolkit), and also used for developing non-GUI programs such as console tools and servers. Qt is most notably used in KDE, Opera, Google Earth, Skype, Qt Extended, Adobe Photoshop Album, VirtualBox and OPIE. It is produced by the Norwegian company Qt Software, formerly known as Trolltech, a wholly owned subsidiary of Nokia since June 17, 2008.[2]
Qt uses C++ with several non-standard extensions implemented by an additional pre-processor that generates standard C++ code before compilation. Qt can also be used in several other programming languages; bindings exist for Ada (QtAda),[3] C# (Qyoto/Kimono), Java (Qt Jambi),[4] Pascal, Perl (Perl Qt4),[5] PHP (PHP-Qt), Ruby (QtRuby), and Python (PyQt). It runs on all major platforms, and has extensive internationalization support. Non-GUI features include SQL database access, XML parsing, thread management, network support and a unified cross-platform API for file handling.
2009年3月5日星期四
基于HID类的USB人机接口设计
基于HID类的USB人机接口设计
http://www.robotsky.com 来源:RobotSky编辑采编 时间:2008-03-05 评论 0 条
(访问论坛) RobotSky恭候您的投稿>>
摘要 USB设备及其驱动程序的复杂性给开发人员带来了很大的开发难度。本文给出一种采用C8051F120微控制器和PDIUSBD12 USB控制器结合的方式实现人机接口设备(Human Interface Devices)的方法,以及如何编写应用程序来对它进行访问。此设备无需编写USB设备驱动程序,Windows系统能够自动识别。
关键词 HID 人机接口设备 USB 描述符 中断传输 报告
目前市场上USB设备的种类繁多,但是这些设备会有一些共同的特性,根据这些特性可以把USB设备划分为不同的类,如显示设备、通信设备、音频设备、大容量存储设备、人机接口设备(HID)。这里介绍如何实现HID类设备,以及如何在应用程序中对HID类设备进行访问。从WINDOWS98操作系统开始,为HID类设备提供了通用的驱动程序,所以只要按照HID设备类的规范编写设备的固件程序,就能够让Windows系统自动识别设备,省去了复杂的驱动程序编写过程。
1 HID协议简介
人机接口设备(HID)主要是指一些人与计算机进行交互的设备,如键盘、鼠标、游戏杆等;但是HID设备不一定非要是这些人机交互设备,只要符合HID设备级定义规范要求的都可以认为是HID设备。HID设备有以下主要特点:
① 交换的数据存储在报告的结构内,设备必须支持HID报告格式。
② 每笔事务可以携带小量或中量的数据。低速设备每笔事务最大为8字节,全速设备每笔最大为64字节,高速设备最大为1 024字节;
③ 有最大传输速度的限制。低速设备最快10 ms一笔事务,最高速度为800 B/s;全速设备最快1 ms一笔事务,最高速度为64 KB/s;高速设备最快125 μs一笔事务,最高速度为24.576 MB/s。
④ 没有传输速度的保证。
当插入USB设备后,主机会向设备请求各种描述符来识别设备。为了把一个设备识别为HID类别,设备在定义描述符的时候必须遵守HID规范。图1显示了 HID各种描述符之间的关系。事实上,每个设备可以有多个接口描述符来实现多接口设备,而且每个接口描述符下应该有多个端点描述符。
图1 HID各种描述符之间的关系
从图1中可以看出,除了USB标准定义的一些描述符外,HID设备还必须定义HID描述符。另外设备和主机的通信是通过报告的形式来实现的,所以还必须定义报告描述符;而物理描述符不是必需的。还有就是HID描述符是关联于接口(而不是端点)的,所以设备不需要为每个端点都提供一个HID描述符。
USB设备有4种传输方式与主机进行通信: 控制方式、中断方式、批量方式和同步方式。每种方式都有它的应用领域。HID只支持控制和中断传输方式。如图2所示,HID设备必须要有默认的控制管道和一个中断输入端点;中断输出端点是可选的。
图2 HID类设备使用控制和中断传输方式
中断输出传输是USB1.1规范才有的内容,且必须获得Windows系统的支持。从WINDOWS98 SE版本开始才支持中断输出传输方式,所以如果需要中断输出传输方式的设备应该选择相应的操作系统。表1列出了传输类型和相关情况。
表1 HID类设备支持的传输方式传输
USB协议定义了11种请求命令,通过这些请求来获得设备的信息及对设备进行设置。HID类设备除了要支持这11种标准的请求外,还要实现以下6种特定请求:
① Get_Report——主机用控制传输从设备接收数据,所有HID类设备都要支持这个请求;
② Set_Report——设备用控制传输接收主机的数据,设备可以不支持此请求;
③ Get_Idle——主机读取设备当前的空闲速率,设备可以不支持此请求;
④ Set_Idle——设置闲置状态,设备可不支持此请求;
⑤ Get_Protocol——主机获得设备的当前活动是引导协议还是报告协议;
⑥ Set_Protocol——在引导协议和报告协议间切换,设备如果支持系统引导(如键盘和鼠标),就必须支持Get_Protocol和Set_Protocol请求。
2 HID接口固件设计与实现
该设备采用C8051F120微控制器和PDIUSBD12芯片来实现,如图3所示。
图3 HID系统结构框图
因为PDIUSBD12的主端点(Endpoint2)具有64字节的双缓冲,能够提供比较高的速度,所以在端点描述符里把它配置为中断传输方式,而Endpoint1没有使用。PDIUSBD12通过中断触发CPU来响应主机的各种请求。
此系统采用的USB协议版本是1.1,所以能够支持中断输出传输。为了让主机把设备识别为HID类别,定义设备接口描述符时类别这一字段的值必须设置为 0x03(HID类别),这样主机就会继续请求获得设备的HID描述符和报告描述符。在主机Get_Descriptor请求中,当值字段的高位字节为 0x21时,表示主机要求获得HID描述符;当值字段高字节为0x22时,就是主机要求获得报告描述符。对于报告描述符,可以参考HID Usage Tables规范。HID Descriptor Tool工具可以帮助建立和测试编写的报告描述符。这里定义了一个输入和输出64字节数据的报告描述符。
code unsigned char szReport[] = {
0x06,0xA0,0xFF,//用法页(FFA0h, vendor defined)
0x09, 0x01,//用法(vendor defined)
0xA1, 0x01,//集合(Application)
0x09, 0x02 ,//用法(vendor defined)
0xA1, 0x00,//集合(Physical)
0x06,0xA1,0xFF,//用法页(vendor defined)
//输入报告
0x09, 0x03 ,//用法(vendor defined)
0x09, 0x04,//用法(vendor defined)
0x15, 0x80,//逻辑最小值(0x80 or -128)
0x25, 0x7F,//逻辑最大值(0x7F or 127)
0x35, 0x00,//物理最小值(0)
0x45,0xFF,//物理最大值(255)
0x75, 0x08,//报告长度Report size (8位)
0x95, 0x40,//报告数值(64 fields)
0x81, 0x02,//输入(data, variable, absolute)
//输出报告
0x09, 0x05,//用法(vendor defined)
0x09, 0x06,//用法(vendor defined)
0x15, 0x80,//逻辑最小值(0x80 or -128)
0x25, 0x7F,//逻辑最大值(0x7F or 127)
0x35, 0x00,//物理最小值(0)
0x45,0xFF,//物理最大值(255)
0x75,0x08,//报告长度(8位)
0x95, 0x40,//报告数值(64 fields)
0x91, 0x02,//输出(data, variable, absolute)
0xC0,//集合结束(Physical)
0xC0//集合结束(Application)
};
这样,后面数据的输入和输出都必须满足报告的格式才能够进行传输。
图4 应用程序枚举HID设备流程
3 应用程序设计实现
Windows为应用程序访问HID设备提供了强大的支持,有一整套对HID设备进行访问的API。应用程序要访问设备就必须先枚举到设备,图4为应用程序枚举HID设备流程。
枚举成功后根据返回的设备句柄,就可以用ReadFile和WriteFile来读写设备的数据了。这里采用异步方式来读写数据,这样不会发生读写时阻塞,提高了程序的效率。以下是异步方式读写设备的要点:
① 为了实现异步访问设备,在CreateFile打开设备时必须使用FILE_FLAG_OVERLAPPED标志。
② 打开设备成功后,使用CreateThread建立1个读设备线程。
③ 在这个线程中首先建立1个OVERLAPPED结构,并用CreateEvent函数初始化它的hEvent成员,这样就创建了1个事件对象。
④ 调用ReadFile函数,并传入这个结构。
⑤ 调用ReadFile后会立即返回,必须调用GetLastError获得出错码。 如果为ERROR_IO_PENDING, 说明此操作是在等待完成的;否则,说明调用出错。
⑥ 调用WaitForSingleObject等待hEvent事件的通知,并使此线程进入休眠状态。如果有数据发送到主机,读线程就会被激活。
WriteFile的使用也同样要求异步操作,与ReadFile的使用差不多。
这里要注意的是,在每次读写数据前都要先接收和发送1字节的PID标志,所以每次读写数据的时候都要多一个字节。比如,这里每次读写的是64字节数据,但是在这64字节之前必须放1字节的PID数据,所以是65字节。一般这个字节的值为0。
4 小结
充分利用PDIUSBD12主端口的双缓冲特性后,测试设备与PC间传输速度能达到8 KB/s以上,对于一些传输数据量不大,速度要求不高,而又必须在短时间内做出响应的场合基本能够满足要求。在此基础上只要生成不同的报告描述符,就能开发出各种不同的嵌入式设备;而且这样的设备无需驱动,在插入PC后就能立刻开始工作,省去了安装驱动程序的过程,方便使用。
http://www.robotsky.com 来源:RobotSky编辑采编 时间:2008-03-05 评论 0 条
(访问论坛) RobotSky恭候您的投稿>>
摘要 USB设备及其驱动程序的复杂性给开发人员带来了很大的开发难度。本文给出一种采用C8051F120微控制器和PDIUSBD12 USB控制器结合的方式实现人机接口设备(Human Interface Devices)的方法,以及如何编写应用程序来对它进行访问。此设备无需编写USB设备驱动程序,Windows系统能够自动识别。
关键词 HID 人机接口设备 USB 描述符 中断传输 报告
目前市场上USB设备的种类繁多,但是这些设备会有一些共同的特性,根据这些特性可以把USB设备划分为不同的类,如显示设备、通信设备、音频设备、大容量存储设备、人机接口设备(HID)。这里介绍如何实现HID类设备,以及如何在应用程序中对HID类设备进行访问。从WINDOWS98操作系统开始,为HID类设备提供了通用的驱动程序,所以只要按照HID设备类的规范编写设备的固件程序,就能够让Windows系统自动识别设备,省去了复杂的驱动程序编写过程。
1 HID协议简介
人机接口设备(HID)主要是指一些人与计算机进行交互的设备,如键盘、鼠标、游戏杆等;但是HID设备不一定非要是这些人机交互设备,只要符合HID设备级定义规范要求的都可以认为是HID设备。HID设备有以下主要特点:
① 交换的数据存储在报告的结构内,设备必须支持HID报告格式。
② 每笔事务可以携带小量或中量的数据。低速设备每笔事务最大为8字节,全速设备每笔最大为64字节,高速设备最大为1 024字节;
③ 有最大传输速度的限制。低速设备最快10 ms一笔事务,最高速度为800 B/s;全速设备最快1 ms一笔事务,最高速度为64 KB/s;高速设备最快125 μs一笔事务,最高速度为24.576 MB/s。
④ 没有传输速度的保证。
当插入USB设备后,主机会向设备请求各种描述符来识别设备。为了把一个设备识别为HID类别,设备在定义描述符的时候必须遵守HID规范。图1显示了 HID各种描述符之间的关系。事实上,每个设备可以有多个接口描述符来实现多接口设备,而且每个接口描述符下应该有多个端点描述符。
图1 HID各种描述符之间的关系
从图1中可以看出,除了USB标准定义的一些描述符外,HID设备还必须定义HID描述符。另外设备和主机的通信是通过报告的形式来实现的,所以还必须定义报告描述符;而物理描述符不是必需的。还有就是HID描述符是关联于接口(而不是端点)的,所以设备不需要为每个端点都提供一个HID描述符。
USB设备有4种传输方式与主机进行通信: 控制方式、中断方式、批量方式和同步方式。每种方式都有它的应用领域。HID只支持控制和中断传输方式。如图2所示,HID设备必须要有默认的控制管道和一个中断输入端点;中断输出端点是可选的。
图2 HID类设备使用控制和中断传输方式
中断输出传输是USB1.1规范才有的内容,且必须获得Windows系统的支持。从WINDOWS98 SE版本开始才支持中断输出传输方式,所以如果需要中断输出传输方式的设备应该选择相应的操作系统。表1列出了传输类型和相关情况。
表1 HID类设备支持的传输方式传输
USB协议定义了11种请求命令,通过这些请求来获得设备的信息及对设备进行设置。HID类设备除了要支持这11种标准的请求外,还要实现以下6种特定请求:
① Get_Report——主机用控制传输从设备接收数据,所有HID类设备都要支持这个请求;
② Set_Report——设备用控制传输接收主机的数据,设备可以不支持此请求;
③ Get_Idle——主机读取设备当前的空闲速率,设备可以不支持此请求;
④ Set_Idle——设置闲置状态,设备可不支持此请求;
⑤ Get_Protocol——主机获得设备的当前活动是引导协议还是报告协议;
⑥ Set_Protocol——在引导协议和报告协议间切换,设备如果支持系统引导(如键盘和鼠标),就必须支持Get_Protocol和Set_Protocol请求。
2 HID接口固件设计与实现
该设备采用C8051F120微控制器和PDIUSBD12芯片来实现,如图3所示。
图3 HID系统结构框图
因为PDIUSBD12的主端点(Endpoint2)具有64字节的双缓冲,能够提供比较高的速度,所以在端点描述符里把它配置为中断传输方式,而Endpoint1没有使用。PDIUSBD12通过中断触发CPU来响应主机的各种请求。
此系统采用的USB协议版本是1.1,所以能够支持中断输出传输。为了让主机把设备识别为HID类别,定义设备接口描述符时类别这一字段的值必须设置为 0x03(HID类别),这样主机就会继续请求获得设备的HID描述符和报告描述符。在主机Get_Descriptor请求中,当值字段的高位字节为 0x21时,表示主机要求获得HID描述符;当值字段高字节为0x22时,就是主机要求获得报告描述符。对于报告描述符,可以参考HID Usage Tables规范。HID Descriptor Tool工具可以帮助建立和测试编写的报告描述符。这里定义了一个输入和输出64字节数据的报告描述符。
code unsigned char szReport[] = {
0x06,0xA0,0xFF,//用法页(FFA0h, vendor defined)
0x09, 0x01,//用法(vendor defined)
0xA1, 0x01,//集合(Application)
0x09, 0x02 ,//用法(vendor defined)
0xA1, 0x00,//集合(Physical)
0x06,0xA1,0xFF,//用法页(vendor defined)
//输入报告
0x09, 0x03 ,//用法(vendor defined)
0x09, 0x04,//用法(vendor defined)
0x15, 0x80,//逻辑最小值(0x80 or -128)
0x25, 0x7F,//逻辑最大值(0x7F or 127)
0x35, 0x00,//物理最小值(0)
0x45,0xFF,//物理最大值(255)
0x75, 0x08,//报告长度Report size (8位)
0x95, 0x40,//报告数值(64 fields)
0x81, 0x02,//输入(data, variable, absolute)
//输出报告
0x09, 0x05,//用法(vendor defined)
0x09, 0x06,//用法(vendor defined)
0x15, 0x80,//逻辑最小值(0x80 or -128)
0x25, 0x7F,//逻辑最大值(0x7F or 127)
0x35, 0x00,//物理最小值(0)
0x45,0xFF,//物理最大值(255)
0x75,0x08,//报告长度(8位)
0x95, 0x40,//报告数值(64 fields)
0x91, 0x02,//输出(data, variable, absolute)
0xC0,//集合结束(Physical)
0xC0//集合结束(Application)
};
这样,后面数据的输入和输出都必须满足报告的格式才能够进行传输。
图4 应用程序枚举HID设备流程
3 应用程序设计实现
Windows为应用程序访问HID设备提供了强大的支持,有一整套对HID设备进行访问的API。应用程序要访问设备就必须先枚举到设备,图4为应用程序枚举HID设备流程。
枚举成功后根据返回的设备句柄,就可以用ReadFile和WriteFile来读写设备的数据了。这里采用异步方式来读写数据,这样不会发生读写时阻塞,提高了程序的效率。以下是异步方式读写设备的要点:
① 为了实现异步访问设备,在CreateFile打开设备时必须使用FILE_FLAG_OVERLAPPED标志。
② 打开设备成功后,使用CreateThread建立1个读设备线程。
③ 在这个线程中首先建立1个OVERLAPPED结构,并用CreateEvent函数初始化它的hEvent成员,这样就创建了1个事件对象。
④ 调用ReadFile函数,并传入这个结构。
⑤ 调用ReadFile后会立即返回,必须调用GetLastError获得出错码。 如果为ERROR_IO_PENDING, 说明此操作是在等待完成的;否则,说明调用出错。
⑥ 调用WaitForSingleObject等待hEvent事件的通知,并使此线程进入休眠状态。如果有数据发送到主机,读线程就会被激活。
WriteFile的使用也同样要求异步操作,与ReadFile的使用差不多。
这里要注意的是,在每次读写数据前都要先接收和发送1字节的PID标志,所以每次读写数据的时候都要多一个字节。比如,这里每次读写的是64字节数据,但是在这64字节之前必须放1字节的PID数据,所以是65字节。一般这个字节的值为0。
4 小结
充分利用PDIUSBD12主端口的双缓冲特性后,测试设备与PC间传输速度能达到8 KB/s以上,对于一些传输数据量不大,速度要求不高,而又必须在短时间内做出响应的场合基本能够满足要求。在此基础上只要生成不同的报告描述符,就能开发出各种不同的嵌入式设备;而且这样的设备无需驱动,在插入PC后就能立刻开始工作,省去了安装驱动程序的过程,方便使用。
2009年3月4日星期三
FW: USB HID报告及报告描述符简介
USB HID报告及报告描述符简介
USB HID报告及报告描述符简介
在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,
配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。
USB报告描述符(Report Descriptor)是HID设备中的一个描述符,它是比较
复杂的一个描述符。
USB HID设备是通过报告来给传送数据的,报告有输入报告和输出报告。
输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等
信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送
给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。报告是
一个数据包,里面包含的是所要传送的数据。输入报告是通过中断输入端点
输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出
端点0发送,当有中断输出端点时,通过中断输出端点发出。
而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。
通过它,USB HOST可以分析出报告里面的数据所表示的意思。它通过控制输入
端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求
是发送到接口的,而不是到设备。一个报告描述符可以描述多个报告,不同的
报告通过报告ID来识别,报告ID在报告最前面,即第一个字节。当报告描述符中
没有规定报告ID时,报告中就没有ID字段,开始就是数据。更详细的说明请参看
USB HID协议,该协议可从Http://www.usb.org下载。
USB报告描述符可以通过使用HID Descriptor tool来生成,这个工具可以
到Http://www.usb.org下载,为了方便大家,我顺便上传了一份。
http://www.ednchina.com /Upload/Blog/2007/4/2/af7c3443-ad61-4465-adc7- a74d28bbc322.zipuploadfile-/2007-4/42672233.zip下面通过由HID Descriptor tool生成的USB鼠标和USB键盘来说明一下报告
描述符和报告。
code char KeyBoardReportDescriptor[63] = {
//表示用途页为通用桌面设备
0x05, 0x01,// USAGE_PAGE (Generic Desktop)
//表示用途为键盘
0x09, 0x06,// USAGE (Keyboard)
//表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION
0xa1, 0x01,// COLLECTION (Application)
//表示用途页为按键
0x05, 0x07,//USAGE_PAGE (Keyboard)
//用途最小值,这里为左ctrl键
0x19, 0xe0,//USAGE_MINIMUM (Keyboard LeftControl)
//用途最大值,这里为右GUI键,即window键
0x29, 0xe7,//USAGE_MAXIMUM (Keyboard Right GUI)
//逻辑最小值为0
0x15, 0x00,//LOGICAL_MINIMUM (0)
//逻辑最大值为1
0x25, 0x01,//LOGICAL_MAXIMUM (1)
//报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为1
0x75, 0x01,//REPORT_SIZE (1)
//报告的个数为8,即总共有8个bits
0x95, 0x08,//REPORT_COUNT (8)
//输入用,变量,值,绝对值。像键盘这类一般报告绝对值,
//而鼠标移动这样的则报告相对值,表示鼠标移动多少
0x81, 0x02,//INPUT (Data,Var,Abs)
//上面这这几项描述了一个输入用的字段,总共为8个bits,每个bit表示一个按键
//分别从左ctrl键到右GUI键。这8个bits刚好构成一个字节,它位于报告的第一个字节。
//它的最低位,即bit-0对应着左ctrl键,如果返回的数据该位为1,则表示左ctrl键被按下,
//否则,左ctrl键没有按下。最高位,即bit-7表示右GUI键的按下情况。中间的几个位,
//需要根据HID协议中规定的用途页表(HID Usage Tables)来确定。这里通常用来表示
//特殊键,例如ctrl,shift,del键等
//这样的数据段个数为1
0x95, 0x01,//REPORT_COUNT (1)
//每个段长度为8bits
0x75, 0x08,//REPORT_SIZE (8)
//输入用,常量,值,绝对值
0x81, 0x03,//INPUT (Cnst,Var,Abs)
//上面这8个bit是常量,设备必须返回0
//这样的数据段个数为5
0x95, 0x05,//REPORT_COUNT (5)
//每个段大小为1bit
0x75, 0x01,//REPORT_SIZE (1)
//用途是LED,即用来控制键盘上的LED用的,因此下面会说明它是输出用
0x05, 0x08,//USAGE_PAGE (LEDs)
//用途最小值是Num Lock,即数字键锁定灯
0x19, 0x01,//USAGE_MINIMUM (Num Lock)
//用途最大值是Kana,这个是什么灯我也不清楚^_^
0x29, 0x05,//USAGE_MAXIMUM (Kana)
//如前面所说,这个字段是输出用的,用来控制LED。变量,值,绝对值。
//1表示灯亮,0表示灯灭
0x91, 0x02,//OUTPUT (Data,Var,Abs)
//这样的数据段个数为1
0x95, 0x01,//REPORT_COUNT (1)
//每个段大小为3bits
0x75, 0x03,//REPORT_SIZE (3)
//输出用,常量,值,绝对
0x91, 0x03,//OUTPUT (Cnst,Var,Abs)
//由于要按字节对齐,而前面控制LED的只用了5个bit,
//所以后面需要附加3个不用bit,设置为常量。
//报告个数为6
0x95, 0x06,//REPORT_COUNT (6)
//每个段大小为8bits
0x75, 0x08,//REPORT_SIZE (8)
//逻辑最小值0
0x15, 0x00,//LOGICAL_MINIMUM (0)
//逻辑最大值255
0x25, 0xFF,//LOGICAL_MAXIMUM (255)
//用途页为按键
0x05, 0x07,//USAGE_PAGE (Keyboard)
//使用最小值为0
0x19, 0x00,//USAGE_MINIMUM (Reserved (no event indicated))
//使用最小值为0x65
0x29, 0x65,//USAGE_MAXIMUM (Keyboard Application)
//输入用,变量,数组,绝对值
0x81, 0x00,//INPUT (Data,Ary,Abs)
//以上定义了6个8bit宽的数组,每个8bit(即一个字节)用来表示一个按键,所以可以同时
//有6个按键按下。没有按键按下时,全部返回0。如果按下的键太多,导致键盘扫描系统
//无法区分按键时,则全部返回0x01,即6个0x01。如果有一个键按下,则这6个字节中的第一
//个字节为相应的键值(具体的值参看HID Usage Tables),如果两个键按下,则第1、2两个
//字节分别为相应的键值,以次类推。
//关集合,跟上面的对应
0xc0// END_COLLECTION
};
通过上面的分析,我们知道这个报告中只有一个报告,所以没有报告ID,
因此返回的都是实际使用的数据。总共有8字节输入,1字节输出。其中输入的
第一字节用来表示特殊按键,第二字节保留,后面的六字节为普通按键。如果
只有左ctrl键按下,则返回01 00 00 00 00 00 00 00(十六进制),如果
只有数字键1 按下,则返回00 00 59 00 00 00 00 00,如果数字
键1 和2 同时按下,则返回00 00 59 5A 00 00 00 00,如果
再按下左shift 键,则返回02 00 59 5A 00 00 00 00,
然后再释放1键,则返回02 00 5A 00 00 00 00 00,
然后全部按键释放,则返回00 00 00 00 00 00 00 00。
这些数据(即报告)都是通过中断端点返回的。当按下Num Lock键时,PC会发送
输出报告,从报告描述符中我们知道,Num Lock的LED对应着输出报告的最低位,
当数字小键盘打开时,输出xxxxxxx1(二进制,打x的由其它的LED状态决定);
当数字小键盘关闭时,输出xxxxxxx0(同前)。取出最低位就可以控制数字键锁定LED了。
下面这个报告描述符是USB鼠标报告描述符,比起键盘的来说要简单些。
它描述了4个字节,第一个字节表示按键,第二个字节表示x轴(即鼠标左右移动,
0表示不动,正值表示往右移,负值表示往左移),第三个字节表示y轴(即鼠标
上下移动,0表示不动,正值表示往下移动,负值表示往上移动),第四个字节
表示鼠标滚轮(正值为往上滚动,负值为往下滚动)。
code char MouseReportDescriptor[52] = {
//通用桌面设备
0x05, 0x01,// USAGE_PAGE (Generic Desktop)
//鼠标
0x09, 0x02,// USAGE (Mouse)
//集合
0xa1, 0x01,// COLLECTION (Application)
//指针设备
0x09, 0x01,//USAGE (Pointer)
//集合
0xa1, 0x00,//COLLECTION (Physical)
//按键
0x05, 0x09,//USAGE_PAGE (Button)
//使用最小值1
0x19, 0x01,//USAGE_MINIMUM (Button 1)
//使用最小值3。1表示左键,2表示右键,3表示中键
0x29, 0x03,//USAGE_MAXIMUM (Button 3)
//逻辑最小值0
0x15, 0x00,//LOGICAL_MINIMUM (0)
//逻辑最大值1
0x25, 0x01,//LOGICAL_MAXIMUM (1)
//数量为3
0x95, 0x03,//REPORT_COUNT (3)
//大小为1bit
0x75, 0x01,//REPORT_SIZE (1)
//输入,变量,数值,绝对值
//以上3个bit分别表示鼠标的三个按键情况,最低位(bit-0)为左键
//bit-1为右键,bit-2为中键,按下时对应的位值为1,释放时对应的值为0
0x81, 0x02,//INPUT (Data,Var,Abs)
//填充5个bit,补足一个字节
0x95, 0x01,//REPORT_COUNT (1)
0x75, 0x05,//REPORT_SIZE (5)
0x81, 0x03,//INPUT (Cnst,Var,Abs)
//用途页为通用桌面
0x05, 0x01,//USAGE_PAGE (Generic Desktop)
//用途为X
0x09, 0x30,//USAGE (X)
//用途为Y
0x09, 0x31,//USAGE (Y)
//用途为滚轮
0x09, 0x38,//USAGE (Wheel)
//逻辑最小值为-127
0x15, 0x81,//LOGICAL_MINIMUM (-127)
//逻辑最大值为+127
0x25, 0x7f,//LOGICAL_MAXIMUM (127)
//大小为8个bits
0x75, 0x08,//REPORT_SIZE (8)
//数量为3个,即分别代表x,y,滚轮
0x95, 0x03,//REPORT_COUNT (3)
//输入,变量,值,相对值
0x81, 0x06,//INPUT (Data,Var,Rel)
//关集合
0xc0,//END_COLLECTION
0xc0// END_COLLECTION
};
通过对上面的报告分析,我们知道报告返回4个字节,没有报告ID。如果鼠标左键按下,
则返回01 00 00 00(十六进制值),如果右键按下,则返回02 00 00 00,如果中键按下,
则返回04 00 00 00,如果三个键同时按下,则返回07 00 00 00。如果鼠标往右移动则
第二字节返回正值,值越大移动速度越快。其它的类推。
这里只对报告描述符做一个简单的介绍,更详细的资料请参看USB HID协议以及HID Usage Tables,
可以从Http://www.usb.org下载。
根据这个实际设计的USB键盘和USB鼠标:
USB键盘:
user1/2198/archives/2007/36484.html
http://www.ednchina.com/blog/computer00/20134/message.aspx
USB鼠标:
user1/2198/archives/2007/36520.html
http://www.ednchina.com/blog/computer00/20135/message.aspx
作者:computer00 2007-5-18 11:19:00
回复1 谢谢Computer00的精彩解释673437
补充一点,HID的报告中有输入报告和输出报告,这些Computer00已经解释得很清楚了,除此之外还有一种功能报告,功能报告是用来传递一些设备状态的。
举个例子,一般键盘上都有三个锁定灯,大小写锁定、数字锁定和滚动锁定,(顺便说一下,00提到的Kana锁定灯是用于输入日文的);在00的例子中这些灯是用输出报告设置的,它们也可以用功能报告设置,这样可以实现上电时预置某些状态,比如要求开机时数字锁定(Num Lock);这样的特性用输出报告只能通过PC端的软件实现了,而用功能报告时,可以在键盘端用硬件设置好(如使用拨动开关或跳线)。
作者:平常人 2007-5-19 18:47:00
回复2 呵呵673438
我找的就是他啊,顶,另外:报告描述符软件还不知道怎么用呢?
oo
作者:isbit 2007-5-19 19:27:00
回复3 呵呵,报告描述符软件自己去摸索一下吧, 我都是乱摸索出来的673439
呵呵,报告描述符软件自己去摸索一下吧, 我都是乱摸索出来的
作者:computer00 2007-5-19 21:23:00
回复4 不会,凑个份子673440
不会,凑个份子
作者:conwh 2007-5-19 21:42:00
回复5 HID里面的机打延时报告描述符怎么设置呀?673441
楼主的对报告描述符的讲解太精辟了.不过我还有个问题,比如说一般键盘都有设置机打延时的,但是在上面的USB报告描述符中只有对LED的设置报告,如果在USB键盘中也要设置机打延时的话,那报告描述符又是怎样的呢?谢谢!
作者:ranjohn 2007-6-6 22:10:00
回复6 HID的报告描述符中没有这个参数673442
一般这个延时是在HOST端解决的。
如果你一定要在设备端解决,唯一的办法就是设备端不断地发报告了。
作者:平常人 2007-6-6 22:14:00
回复7 明了673443
说得很有道理,可能是在主机端根据控制面板里面键盘的设置自已设置好了的。
作者:ranjohn 2007-6-7 22:13:00
回复8 在主机端解决的!673444
经过验证,确实是在主机端解决的。
USB HID报告及报告描述符简介
在USB中,USB HOST是通过各种描述符来识别设备的,有设备描述符,
配置描述符,接口描述符,端点描述符,字符串描述符,报告描述符等等。
USB报告描述符(Report Descriptor)是HID设备中的一个描述符,它是比较
复杂的一个描述符。
USB HID设备是通过报告来给传送数据的,报告有输入报告和输出报告。
输入报告是USB设备发送给主机的,例如USB鼠标将鼠标移动和鼠标点击等
信息返回给电脑,键盘将按键数据数据返回给电脑等;输出报告是主机发送
给USB设备的,例如键盘上的数字键盘锁定灯和大写字母锁定灯等。报告是
一个数据包,里面包含的是所要传送的数据。输入报告是通过中断输入端点
输入的,而输出报告有点区别,当没有中断输出端点时,可以通过控制输出
端点0发送,当有中断输出端点时,通过中断输出端点发出。
而报告描述符,是描述一个报告以及报告里面的数据是用来干什么用的。
通过它,USB HOST可以分析出报告里面的数据所表示的意思。它通过控制输入
端点0返回,主机使用获取报告描述符命令来获取报告描述符,注意这个请求
是发送到接口的,而不是到设备。一个报告描述符可以描述多个报告,不同的
报告通过报告ID来识别,报告ID在报告最前面,即第一个字节。当报告描述符中
没有规定报告ID时,报告中就没有ID字段,开始就是数据。更详细的说明请参看
USB HID协议,该协议可从Http://www.usb.org下载。
USB报告描述符可以通过使用HID Descriptor tool来生成,这个工具可以
到Http://www.usb.org下载,为了方便大家,我顺便上传了一份。
http://www.ednchina.com /Upload/Blog/2007/4/2/af7c3443-ad61-4465-adc7- a74d28bbc322.zipuploadfile-/2007-4/42672233.zip下面通过由HID Descriptor tool生成的USB鼠标和USB键盘来说明一下报告
描述符和报告。
code char KeyBoardReportDescriptor[63] = {
//表示用途页为通用桌面设备
0x05, 0x01,// USAGE_PAGE (Generic Desktop)
//表示用途为键盘
0x09, 0x06,// USAGE (Keyboard)
//表示应用集合,必须要以END_COLLECTION来结束它,见最后的END_COLLECTION
0xa1, 0x01,// COLLECTION (Application)
//表示用途页为按键
0x05, 0x07,//USAGE_PAGE (Keyboard)
//用途最小值,这里为左ctrl键
0x19, 0xe0,//USAGE_MINIMUM (Keyboard LeftControl)
//用途最大值,这里为右GUI键,即window键
0x29, 0xe7,//USAGE_MAXIMUM (Keyboard Right GUI)
//逻辑最小值为0
0x15, 0x00,//LOGICAL_MINIMUM (0)
//逻辑最大值为1
0x25, 0x01,//LOGICAL_MAXIMUM (1)
//报告大小(即这个字段的宽度)为1bit,所以前面的逻辑最小值为0,逻辑最大值为1
0x75, 0x01,//REPORT_SIZE (1)
//报告的个数为8,即总共有8个bits
0x95, 0x08,//REPORT_COUNT (8)
//输入用,变量,值,绝对值。像键盘这类一般报告绝对值,
//而鼠标移动这样的则报告相对值,表示鼠标移动多少
0x81, 0x02,//INPUT (Data,Var,Abs)
//上面这这几项描述了一个输入用的字段,总共为8个bits,每个bit表示一个按键
//分别从左ctrl键到右GUI键。这8个bits刚好构成一个字节,它位于报告的第一个字节。
//它的最低位,即bit-0对应着左ctrl键,如果返回的数据该位为1,则表示左ctrl键被按下,
//否则,左ctrl键没有按下。最高位,即bit-7表示右GUI键的按下情况。中间的几个位,
//需要根据HID协议中规定的用途页表(HID Usage Tables)来确定。这里通常用来表示
//特殊键,例如ctrl,shift,del键等
//这样的数据段个数为1
0x95, 0x01,//REPORT_COUNT (1)
//每个段长度为8bits
0x75, 0x08,//REPORT_SIZE (8)
//输入用,常量,值,绝对值
0x81, 0x03,//INPUT (Cnst,Var,Abs)
//上面这8个bit是常量,设备必须返回0
//这样的数据段个数为5
0x95, 0x05,//REPORT_COUNT (5)
//每个段大小为1bit
0x75, 0x01,//REPORT_SIZE (1)
//用途是LED,即用来控制键盘上的LED用的,因此下面会说明它是输出用
0x05, 0x08,//USAGE_PAGE (LEDs)
//用途最小值是Num Lock,即数字键锁定灯
0x19, 0x01,//USAGE_MINIMUM (Num Lock)
//用途最大值是Kana,这个是什么灯我也不清楚^_^
0x29, 0x05,//USAGE_MAXIMUM (Kana)
//如前面所说,这个字段是输出用的,用来控制LED。变量,值,绝对值。
//1表示灯亮,0表示灯灭
0x91, 0x02,//OUTPUT (Data,Var,Abs)
//这样的数据段个数为1
0x95, 0x01,//REPORT_COUNT (1)
//每个段大小为3bits
0x75, 0x03,//REPORT_SIZE (3)
//输出用,常量,值,绝对
0x91, 0x03,//OUTPUT (Cnst,Var,Abs)
//由于要按字节对齐,而前面控制LED的只用了5个bit,
//所以后面需要附加3个不用bit,设置为常量。
//报告个数为6
0x95, 0x06,//REPORT_COUNT (6)
//每个段大小为8bits
0x75, 0x08,//REPORT_SIZE (8)
//逻辑最小值0
0x15, 0x00,//LOGICAL_MINIMUM (0)
//逻辑最大值255
0x25, 0xFF,//LOGICAL_MAXIMUM (255)
//用途页为按键
0x05, 0x07,//USAGE_PAGE (Keyboard)
//使用最小值为0
0x19, 0x00,//USAGE_MINIMUM (Reserved (no event indicated))
//使用最小值为0x65
0x29, 0x65,//USAGE_MAXIMUM (Keyboard Application)
//输入用,变量,数组,绝对值
0x81, 0x00,//INPUT (Data,Ary,Abs)
//以上定义了6个8bit宽的数组,每个8bit(即一个字节)用来表示一个按键,所以可以同时
//有6个按键按下。没有按键按下时,全部返回0。如果按下的键太多,导致键盘扫描系统
//无法区分按键时,则全部返回0x01,即6个0x01。如果有一个键按下,则这6个字节中的第一
//个字节为相应的键值(具体的值参看HID Usage Tables),如果两个键按下,则第1、2两个
//字节分别为相应的键值,以次类推。
//关集合,跟上面的对应
0xc0// END_COLLECTION
};
通过上面的分析,我们知道这个报告中只有一个报告,所以没有报告ID,
因此返回的都是实际使用的数据。总共有8字节输入,1字节输出。其中输入的
第一字节用来表示特殊按键,第二字节保留,后面的六字节为普通按键。如果
只有左ctrl键按下,则返回01 00 00 00 00 00 00 00(十六进制),如果
只有数字键1 按下,则返回00 00 59 00 00 00 00 00,如果数字
键1 和2 同时按下,则返回00 00 59 5A 00 00 00 00,如果
再按下左shift 键,则返回02 00 59 5A 00 00 00 00,
然后再释放1键,则返回02 00 5A 00 00 00 00 00,
然后全部按键释放,则返回00 00 00 00 00 00 00 00。
这些数据(即报告)都是通过中断端点返回的。当按下Num Lock键时,PC会发送
输出报告,从报告描述符中我们知道,Num Lock的LED对应着输出报告的最低位,
当数字小键盘打开时,输出xxxxxxx1(二进制,打x的由其它的LED状态决定);
当数字小键盘关闭时,输出xxxxxxx0(同前)。取出最低位就可以控制数字键锁定LED了。
下面这个报告描述符是USB鼠标报告描述符,比起键盘的来说要简单些。
它描述了4个字节,第一个字节表示按键,第二个字节表示x轴(即鼠标左右移动,
0表示不动,正值表示往右移,负值表示往左移),第三个字节表示y轴(即鼠标
上下移动,0表示不动,正值表示往下移动,负值表示往上移动),第四个字节
表示鼠标滚轮(正值为往上滚动,负值为往下滚动)。
code char MouseReportDescriptor[52] = {
//通用桌面设备
0x05, 0x01,// USAGE_PAGE (Generic Desktop)
//鼠标
0x09, 0x02,// USAGE (Mouse)
//集合
0xa1, 0x01,// COLLECTION (Application)
//指针设备
0x09, 0x01,//USAGE (Pointer)
//集合
0xa1, 0x00,//COLLECTION (Physical)
//按键
0x05, 0x09,//USAGE_PAGE (Button)
//使用最小值1
0x19, 0x01,//USAGE_MINIMUM (Button 1)
//使用最小值3。1表示左键,2表示右键,3表示中键
0x29, 0x03,//USAGE_MAXIMUM (Button 3)
//逻辑最小值0
0x15, 0x00,//LOGICAL_MINIMUM (0)
//逻辑最大值1
0x25, 0x01,//LOGICAL_MAXIMUM (1)
//数量为3
0x95, 0x03,//REPORT_COUNT (3)
//大小为1bit
0x75, 0x01,//REPORT_SIZE (1)
//输入,变量,数值,绝对值
//以上3个bit分别表示鼠标的三个按键情况,最低位(bit-0)为左键
//bit-1为右键,bit-2为中键,按下时对应的位值为1,释放时对应的值为0
0x81, 0x02,//INPUT (Data,Var,Abs)
//填充5个bit,补足一个字节
0x95, 0x01,//REPORT_COUNT (1)
0x75, 0x05,//REPORT_SIZE (5)
0x81, 0x03,//INPUT (Cnst,Var,Abs)
//用途页为通用桌面
0x05, 0x01,//USAGE_PAGE (Generic Desktop)
//用途为X
0x09, 0x30,//USAGE (X)
//用途为Y
0x09, 0x31,//USAGE (Y)
//用途为滚轮
0x09, 0x38,//USAGE (Wheel)
//逻辑最小值为-127
0x15, 0x81,//LOGICAL_MINIMUM (-127)
//逻辑最大值为+127
0x25, 0x7f,//LOGICAL_MAXIMUM (127)
//大小为8个bits
0x75, 0x08,//REPORT_SIZE (8)
//数量为3个,即分别代表x,y,滚轮
0x95, 0x03,//REPORT_COUNT (3)
//输入,变量,值,相对值
0x81, 0x06,//INPUT (Data,Var,Rel)
//关集合
0xc0,//END_COLLECTION
0xc0// END_COLLECTION
};
通过对上面的报告分析,我们知道报告返回4个字节,没有报告ID。如果鼠标左键按下,
则返回01 00 00 00(十六进制值),如果右键按下,则返回02 00 00 00,如果中键按下,
则返回04 00 00 00,如果三个键同时按下,则返回07 00 00 00。如果鼠标往右移动则
第二字节返回正值,值越大移动速度越快。其它的类推。
这里只对报告描述符做一个简单的介绍,更详细的资料请参看USB HID协议以及HID Usage Tables,
可以从Http://www.usb.org下载。
根据这个实际设计的USB键盘和USB鼠标:
USB键盘:
user1/2198/archives/2007/36484.html
http://www.ednchina.com/blog/computer00/20134/message.aspx
USB鼠标:
user1/2198/archives/2007/36520.html
http://www.ednchina.com/blog/computer00/20135/message.aspx
作者:computer00 2007-5-18 11:19:00
回复1 谢谢Computer00的精彩解释673437
补充一点,HID的报告中有输入报告和输出报告,这些Computer00已经解释得很清楚了,除此之外还有一种功能报告,功能报告是用来传递一些设备状态的。
举个例子,一般键盘上都有三个锁定灯,大小写锁定、数字锁定和滚动锁定,(顺便说一下,00提到的Kana锁定灯是用于输入日文的);在00的例子中这些灯是用输出报告设置的,它们也可以用功能报告设置,这样可以实现上电时预置某些状态,比如要求开机时数字锁定(Num Lock);这样的特性用输出报告只能通过PC端的软件实现了,而用功能报告时,可以在键盘端用硬件设置好(如使用拨动开关或跳线)。
作者:平常人 2007-5-19 18:47:00
回复2 呵呵673438
我找的就是他啊,顶,另外:报告描述符软件还不知道怎么用呢?
oo
作者:isbit 2007-5-19 19:27:00
回复3 呵呵,报告描述符软件自己去摸索一下吧, 我都是乱摸索出来的673439
呵呵,报告描述符软件自己去摸索一下吧, 我都是乱摸索出来的
作者:computer00 2007-5-19 21:23:00
回复4 不会,凑个份子673440
不会,凑个份子
作者:conwh 2007-5-19 21:42:00
回复5 HID里面的机打延时报告描述符怎么设置呀?673441
楼主的对报告描述符的讲解太精辟了.不过我还有个问题,比如说一般键盘都有设置机打延时的,但是在上面的USB报告描述符中只有对LED的设置报告,如果在USB键盘中也要设置机打延时的话,那报告描述符又是怎样的呢?谢谢!
作者:ranjohn 2007-6-6 22:10:00
回复6 HID的报告描述符中没有这个参数673442
一般这个延时是在HOST端解决的。
如果你一定要在设备端解决,唯一的办法就是设备端不断地发报告了。
作者:平常人 2007-6-6 22:14:00
回复7 明了673443
说得很有道理,可能是在主机端根据控制面板里面键盘的设置自已设置好了的。
作者:ranjohn 2007-6-7 22:13:00
回复8 在主机端解决的!673444
经过验证,确实是在主机端解决的。
订阅:
博文 (Atom)