俺的个人看法,装 MSYS2 64 是最容易的。
https://www.msys2.org/
装完重启就好了。
如果要设置环境变量, 自己填一下也就是几分钟的事情。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
之前俺介绍过怎么在 LINUX 下面, 配置 JSON 文件来跑 GTK hello world 示范。
但是, 更多的网友可能希望在 WINDOWS 下面能跑一炮 GTK+3 HELLO WORLD 窗口。
网上的教程尽管都很多, 但是俺没找到合适俺的。
俺最近迷上了 VS CODE, 大家都知道俺是菜鸟,俺没啥文化, 初中毕业。
俺弄个教程, 希望广大初中毕业的同学都能看懂。
https://wiki.gnome.org/Projects/gtkmm/MSWindows pacman -S mingw-w64-x86_64-gtkmm3
程序代码:
** 备注: 这个代码是给您复制粘贴的, 不需要去理解具体的内容。
#include <gtk/gtk.h> #include <iostream> using namespace std; /* on quitte l'application en fermant la fenêtre */ void on_window_closed (GtkWidget *window, gpointer data) { gtk_main_quit(); } int main (int argc, char *argv[]) { /* déclaration des variables */ GtkWidget *window, *label, *box, *button ; /* initialiser GTK+ */ gtk_init(&argc,&argv); /* créer la fenêtre avec son titre */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW (window), "Test GTK+3"); /* créer les widgets */ box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5); label = gtk_label_new("Hello World!"); button = gtk_button_new_with_label ("您好, 老铁!"); /* positionner les widgets */ gtk_box_pack_start(GTK_BOX (box), label, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX (box), button, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER (window), box); /* afficher la fenêtre */ gtk_widget_show_all(window); /* boucle principale */ gtk_main(); return 0; }
VSCODE 俺假设您已经安装好了。
GTK+3 俺是遵照 GTK 网站的 2 个“指南” 安装的。
https://www.gtk.org/docs/installations/windows/
但是, 俺没能顺利地在 VS CODE 下面跑 GTK HELLO WORLD 窗口. 所以俺觉得, 这两个指南有一点指北的意思。
如果您看到这里, 恐怕俺得重复一下, 这是 WINDOWS 的环境和语境。
第一个GTK 网站的指南的GTK+3 安装步骤:
https://www.gtk.org/docs/installations/windows/
**备注: 事后回顾, 俺觉得 MSYS2 的 GCC 和 G++ 版本也许是全世界最新的,所以您装 MSYS2 packages 应该最保险。
第一步
下载与您平台匹配的 MSYS2 安装程序,按照安装说明进行安装.
https://www.msys2.org/ https://repo.msys2.org/distrib/x86_64/msys2-x86_64-20210228.exe
后续可以复制粘贴的东西
pacman -Syu pacman -Su pacman -S --needed base-devel mingw-w64-x86_64-toolchain pacman -S mingw-w64-x86_64-gtk3 pacman -S mingw-w64-x86_64-glade pacman -S mingw-w64-x86_64-python3-gobject https://packages.msys2.org/package/mingw-w64-x86_64-adwaita-icon-theme pacman -S mingw-w64-x86_64-adwaita-icon-theme pacman -S mingw-w64-x86_64-hicolor-icon-theme https://packages.msys2.org/package/mingw-w64-x86_64-glade?repo=mingw64 pacman -S mingw-w64-x86_64-gtk2
第二步:
安装GTK3及其依赖项。打开MSYS2的shell,然后运行:
pacman -S mingw-w64-x86_64-gtk3。
**备注: 基本上就是复制粘贴,图中因为是重复安装所以您看到的屏幕输出应该略有不同。
第三步: (推荐)
安装GTK核心应用程序
Glade是GTK的GUI设计器。它可以让你设计你的GUI并以XML格式导出。然后你可以使用GtkBuilder API从你的代码中导入GUI。
阅读GTK手册中的GtkBuilder部分以获得更多信息。
要安装Glade:
pacman -S mingw-w64-x86_64-glade。
第四步 (可选)
如想在 Python 中开发GTK3 应用, 要安装Python绑定:
pacman -s mingw-w64-x86_64-python3-gobject
如用 Python 2:
pacman -S mingw-w64-x86_64-python2-gobject
第五步 (可选)
安装构建工具.
如用C、C++、Fortran 等其他语言开发 GTK3 应用程序,需要一个编译器。
如gcc和其他开发工具:
pacman -S mingw-w64-x86_64-toolchain base-devel。
至此, GTK3 就算是搞完了。其他要找的包或者相关信息, 可以从网路上阅读
https://packages.msys2.org/package/mingw-w64-x86_64-glade?repo=mingw64
在 WINDOWS 10 下跑个 HELLO WORLD 窗口确实是要设置不少东西, 也许您可以跳过, 但出问题的时候, 您就会搞不懂是环境变量还是其他的根源。
当然,老鸟会用 SET 命令和批处理来射问题。 但作为菜鸟,俺喜欢比较静态的解决办法, 射好了就不要再轻易改变, 不然烧脑得紧。 如果喜欢烧脑, 不妨自行研究梅森这样的好东西。
https://mesonbuild.com/
Microsoft Windows [Version 10.0.19042.867] (c) 2020 Microsoft Corporation. All rights reserved. C:Userswenxue>set PKG_CONFIG_PATH PKG_CONFIG_PATH=C:msys64mingw64libpkgconfig
Microsoft Windows [Version 10.0.19042.867] (c) 2020 Microsoft Corporation. All rights reserved. C:Userswenxue>set LIB LIB=C:GTKLIB;C:vs19btoolVCToolsMSVC14.28.29333libx64; C:vs19btoolVCToolsMSVC14.28.29333libonecorex64; C:Program Files (x86)Windows Kits10Lib10.0.19041.0ucrtx64; C:Program Files (x86)Windows Kits10Lib10.0.19041.0umx64;C:msys64mingw64lib; C:msys64mingw64x86_64-w64-mingw32lib;C:msys64usrlib; C:msys64mingw64libglib-2.0include; C:Userswenxue>SET INCLUDE INCLUDE=C:GTKINCLUDE;C:GTKINCLUDEGTK-2.0;C:GTKINCLUDEGLIB-2.0;C:GTKINCLUDEPANGO-1.0; C:GTKINCLUDECAIRO;C:GTKINCLUDEATK-1.0;C:GTKINCLUDEGTKGLEXT-1.0; C:GTKLIBGTK-2.0INCLUDE;C:GTKLIBGLIB-2.0INCLUDE;C:GTKLIBGTKGLEXT-1.0INCLUDE; C:GTKINCLUDELIBGLADE-2.0;C:GTKINCLUDELIBXML2; C:vs19btoolVCToolsMSVC14.28.29333include; C:Program Files (x86)Windows Kits10Include10.0.19041.0ucrt; C:Program Files (x86)Windows Kits10Include10.0.19041.0shared; C:Program Files (x86)Windows Kits10Include10.0.19041.0um; C:msys64mingw64x86_64-w64-mingw32include;C:msys64usrinclude; C:msys64mingw64include;C:msys64mingw64includeglib-2.0; C:msys64mingw64includegtk-3.0gtk;C:msys64mingw64includegtk-3.0gdk; C:Program Files (x86)Microsoft Visual Studio 14.0VCinclude; C:Userswenxue>
*** 备注: 环境变量的输出, 俺为了可读性加了换行回车, 实际是没有那么多换行回车的
**备注: 具体的环境变量和具体的机器以及软件配置相关。 仅供参考
C:GTKINCLUDE;C:GTKINCLUDEGTK-2.0;C:GTKINCLUDEGLIB-2.0;C:GTKINCLUDEPANGO-1.0;C:GTKINCLUDECAIRO;C:GTKINCLUDEATK-1.0;C:GTKINCLUDEGTKGLEXT-1.0;C:GTKLIBGTK-2.0INCLUDE;C:GTKLIBGLIB-2.0INCLUDE;C:GTKLIBGTKGLEXT-1.0INCLUDE;C:GTKINCLUDELIBGLADE-2.0;C:GTKINCLUDELIBXML2;C:vs19btoolVCToolsMSVC14.28.29333include;C:Program Files (x86)Windows Kits10Include10.0.19041.0ucrt;C:Program Files (x86)Windows Kits10Include10.0.19041.0shared;C:Program Files (x86)Windows Kits10Include10.0.19041.0um;C:msys64mingw64x86_64-w64-mingw32include;C:msys64usrinclude;C:asiosdkcommon;C:asiosdkhost;C:asiosdkhostpc;C:portaudioinclude;C:_PortAud_LIBx64Release;C:msys64mingw64include;C:msys64mingw64includeglib-2.0;C:msys64mingw64includegtk-3.0gtk;C:msys64mingw64includegtk-3.0gdk;C:Program Files (x86)Microsoft Visual Studio 14.0VCinclude;
在之前 LINUX 下的 VS CODE 设置里面, 可以用反撇号和美元符号的方法动态植入 PKG-CONFIG 返回的结果, 直接动态插入到 GCC 或者 G++ 的编译命令里面形成开关参数。
可惜的是, WINDOWS 没有反撇号 ` (backtick) 这种玩法,或者有但是因为俺RPWT不知道, 只能用批处理或者批处理加环境变量的法子来曲线救国。 转进, 转进再转进。
VS CODE 好在有个 TASKS.JSON 文件。
可以把 PKG-CONFIG 返回的结果全部静态地写进去。
这其实免了很多不确定性。
俺看了网上不少教程都没有提到这个法子。
实验了一番, 果然就能在 WINDOWS 10 下跑 GTK hello WORLD 窗口了。
TASKS.JSON
{ "version": "2.0.0", "tasks": [ { "type": "cppbuild", "label": "MSYS2_64 C/C++: gcc.exe build active file", "command": "C:\msys64\mingw64\bin\gcc.exe", "args": [ "-g", "-Wall", "-Wextra", "${file}", "-o", "${fileDirname}\${fileBasenameNoExtension}.exe", "-lm", "-fdiagnostics-color=always", "-IC:/msys64/mingw64/include/gtk-3.0", "-IC:/msys64/mingw64/include/pango-1.0", "-IC:/msys64/mingw64/include", "-IC:/msys64/mingw64/include/glib-2.0", "-IC:/msys64/mingw64/lib/glib-2.0/include", "-IC:/msys64/mingw64/include/harfbuzz", "-IC:/msys64/mingw64/include/freetype2", "-IC:/msys64/mingw64/include/libpng16", "-IC:/msys64/mingw64/include/fribidi", "-IC:/msys64/mingw64/include/cairo", "-IC:/msys64/mingw64/include/lzo", "-IC:/msys64/mingw64/include/pixman-1", "-mms-bitfields", "-IC:/msys64/mingw64/include/gdk-pixbuf-2.0", "-IC:/msys64/mingw64/include/atk-1.0", "-lgtk-3", "-lgdk-3", "-lz", "-lgdi32", "-limm32", "-lshell32", "-lole32", "-luuid", "-lwinmm", "-ldwmapi", "-lsetupapi", "-lcfgmgr32", "-lpangowin32-1.0", "-lpangocairo-1.0", "-lpango-1.0", "-lharfbuzz", "-latk-1.0", "-lcairo-gobject", "-lcairo", "-lgdk_pixbuf-2.0", "-lgio-2.0", "-lgobject-2.0", "-lglib-2.0", "-lintl" ], "options": { "cwd": "C:\msys64\mingw64\bin" }, "problemMatcher": [ "$gcc" ], "detail": "compiler: C:\msys64\mingw64\bin\gcc.exe", "group": "build" }, { "type": "cppbuild", "label": "MSYS2 GCC_10 C/C++: g++.exe build active file", "command": "C:\msys64\mingw64\bin\g++.exe", "args": [ "-g", "-Wall", "-Wextra", "-mms-bitfields", "${file}", "-o", "${fileDirname}\${fileBasenameNoExtension}.exe", "-lm", "-lole32", "-lkernel32", "-lucrt", "-D_FILE_OFFSET_BITS=64", "-D_LARGEFILE64_SOURCE", "-fdiagnostics-color=always", "-IC:/msys64/mingw64/include/gtk-3.0", "-IC:/msys64/mingw64/include/pango-1.0", "-IC:/msys64/mingw64/include", "-IC:/msys64/mingw64/include/glib-2.0", "-IC:/msys64/mingw64/lib/glib-2.0/include", "-IC:/msys64/mingw64/include/harfbuzz", "-IC:/msys64/mingw64/include/freetype2", "-IC:/msys64/mingw64/include/libpng16", "-IC:/msys64/mingw64/include/fribidi", "-IC:/msys64/mingw64/include/cairo", "-IC:/msys64/mingw64/include/lzo", "-IC:/msys64/mingw64/include/pixman-1", "-mms-bitfields", "-IC:/msys64/mingw64/include/gdk-pixbuf-2.0", "-IC:/msys64/mingw64/include/atk-1.0", "-lgtk-3", "-lgdk-3", "-lz", "-lgdi32", "-limm32", "-lshell32", "-lole32", "-luuid", "-lwinmm", "-ldwmapi", "-lsetupapi", "-lcfgmgr32", "-lpangowin32-1.0", "-lpangocairo-1.0", "-lpango-1.0", "-lharfbuzz", "-latk-1.0", "-lcairo-gobject", "-lcairo", "-lgdk_pixbuf-2.0", "-lgio-2.0", "-lgobject-2.0", "-lglib-2.0", "-lintl" ], "options": { "cwd": "C:\msys64\mingw64\bin" }, "problemMatcher": [ "$gcc" ], "detail": "compiler: C:\msys64\mingw64\bin\g++.exe", "group": { "kind": "build", "isDefault": true } } ] }
是的, 就是那么简单。
您基本只要复制粘贴,
就可以了。
大家都知道俺是菜鸟,俺没啥文化, 初中毕业。
C:msys64mingw64in> C:msys64mingw64in>pkg-config --cflags gtk+-3.0 -IC:/msys64/mingw64/include/gtk-3.0 -IC:/msys64/mingw64/include/pango-1.0 -IC:/msys64/mingw64/include -IC:/msys64/mingw64/include/glib-2.0 -IC:/msys64/mingw64/lib/glib-2.0/include -IC:/msys64/mingw64/include/harfbuzz -IC:/msys64/mingw64/include/freetype2 -IC:/msys64/mingw64/include/libpng16 -mms-bitfields -IC:/msys64/mingw64/include/fribidi -IC:/msys64/mingw64/include/cairo -IC:/msys64/mingw64/include/lzo -IC:/msys64/mingw64/include/pixman-1 -mms-bitfields -mms-bitfields -mms-bitfields -mms-bitfields -mms-bitfields -mms-bitfields -mms-bitfields -IC:/msys64/mingw64/include/gdk-pixbuf-2.0 -mms-bitfields -mms-bitfields -mms-bitfields -IC:/msys64/mingw64/include/atk-1.0 -mms-bitfields -mms-bitfields -mms-bitfields -pthread -mms-bitfields
C:msys64mingw64in>pkg-config --libs gtk+-3.0 -LC:/msys64/mingw64/lib -lgtk-3 -lgdk-3 -lz -lgdi32 -limm32 -lshell32 -lole32 -Wl,-luuid -lwinmm -ldwmapi -lsetupapi -lcfgmgr32 -lpangowin32-1.0 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lintl C:msys64mingw64in>
c_cpp_properties.json
c_cpp_properties.json 这个文件里面的设置, 似乎只是给插件帮助您分析和智能提示用的。
对编译是没有帮助和影响的, 即使屏蔽了所有的引用, 编译不受影响。
所以, 编译不了, 跑不出结果别把精力或者时间放在这个 c_cpp_properties.json 文件上。没有鸾用。
// "C:/msys64/mingw64/include", // "C:/msys64/mingw64/include/gtk-3.0", // "C:/msys64/mingw64/include/gtk-3.0/gtk", // "C:/msys64/mingw64/include/gtk-3.0/gdk", // "C:/msys64/mingw64/include/glib-2.0", // "C:/msys64/mingw64/include/gtk-3.0", // "C:/msys64/mingw64/include/pango-1.0", // "C:/msys64/mingw64/include", // "C:/msys64/mingw64/include/glib-2.0", // "C:/msys64/mingw64/lib/glib-2.0/include", // "C:/msys64/mingw64/include/harfbuzz", // "C:/msys64/mingw64/include/freetype2", // "C:/msys64/mingw64/include/libpng16", // "C:/msys64/mingw64/include/fribidi", // "C:/msys64/mingw64/include/cairo", // "C:/msys64/mingw64/include/lzo", // "C:/msys64/mingw64/include/pixman-1", // "C:/msys64/mingw64/include/gdk-pixbuf-2.0", // "C:/msys64/mingw64/include/atk-1.0", // "C:/msys64/mingw64/lib",
基本上网上的比较简单的示例就可以在 WINDOWS 下用 GCC/G++编译了。
// HORIZONTAL SLIDER #include <gtk/gtk.h> void value_changed(GtkRange *range, gpointer win) { gdouble val = gtk_range_get_value(range); gchar *str = g_strdup_printf("%.f", val); gtk_label_set_text(GTK_LABEL(win), str); g_free(str); } int main(int argc, char *argv[]) { GtkWidget *window; GtkWidget *halign; GtkWidget *hbox; GtkWidget *hscale; GtkWidget *label; gtk_init(&argc, &argv); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); gtk_window_set_default_size(GTK_WINDOW(window), 300, 250); gtk_container_set_border_width(GTK_CONTAINER(window), 10); gtk_window_set_title(GTK_WINDOW(window), "GtkHScale"); hbox = gtk_hbox_new(FALSE, 20); hscale = gtk_hscale_new_with_range(0, 100, 1); gtk_scale_set_draw_value(GTK_SCALE(hscale), FALSE); gtk_widget_set_size_request(hscale, 150, -1); label = gtk_label_new("..."); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 1); gtk_box_pack_start(GTK_BOX(hbox), hscale, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); halign = gtk_alignment_new(0, 0, 0, 0); gtk_container_add(GTK_CONTAINER(halign), hbox); gtk_container_add(GTK_CONTAINER(window), halign); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); g_signal_connect(hscale, "value-changed", G_CALLBACK(value_changed), label); gtk_widget_show_all(window); gtk_main(); return 0; }
> Executing task: MSYS2_64 C/C++: gcc.exe build active file < Starting build... C:msys64mingw64ingcc.exe -g -Wall -Wextra C:___GTK___gtk_hor_slider_test.c -o C:___GTK___gtk_hor_slider_test.exe -lm -fdiagnostics-color=always -IC:/msys64/mingw64/include/gtk-3.0 -IC:/msys64/mingw64/include/pango-1.0 -IC:/msys64/mingw64/include -IC:/msys64/mingw64/include/glib-2.0 -IC:/msys64/mingw64/lib/glib-2.0/include -IC:/msys64/mingw64/include/harfbuzz -IC:/msys64/mingw64/include/freetype2 -IC:/msys64/mingw64/include/libpng16 -IC:/msys64/mingw64/include/fribidi -IC:/msys64/mingw64/include/cairo -IC:/msys64/mingw64/include/lzo -IC:/msys64/mingw64/include/pixman-1 -mms-bitfields -IC:/msys64/mingw64/include/gdk-pixbuf-2.0 -IC:/msys64/mingw64/include/atk-1.0 -lgtk-3 -lgdk-3 -lz -lole32 -lkernel32 -luser32 -lgdi32 -lwinmm -limm32 -lshell32 -lComdlg32 -luuid -ldwmapi -lsetupapi -lcfgmgr32 -lpangowin32-1.0 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lintl C:___GTK___gtk_hor_slider_test.c: In function 'main': C:___GTK___gtk_hor_slider_test.c:30:3: warning: 'gtk_hbox_new' is deprecated: Use 'gtk_box_new' instead [-Wdeprecated-declarations] 30 | hbox = gtk_hbox_new(FALSE, 20); | ^~~~ In file included from C:/msys64/mingw64/include/gtk-3.0/gtk/gtk.h:262, from C:___GTK___gtk_hor_slider_test.c:1: C:/msys64/mingw64/include/gtk-3.0/gtk/deprecated/gtkhbox.h:63:13: note: declared here 63 | GtkWidget * gtk_hbox_new (gboolean homogeneous, | ^~~~~~~~~~~~ C:___GTK___gtk_hor_slider_test.c:32:3: warning: 'gtk_hscale_new_with_range' is deprecated: Use 'gtk_scale_new_with_range' instead [-Wdeprecated-declarations] 32 | hscale = gtk_hscale_new_with_range(0, 100, 1); | ^~~~~~ In file included from C:/msys64/mingw64/include/gtk-3.0/gtk/gtk.h:265, from C:___GTK___gtk_hor_slider_test.c:1: C:/msys64/mingw64/include/gtk-3.0/gtk/deprecated/gtkhscale.h:63:12: note: declared here 63 | GtkWidget* gtk_hscale_new_with_range (gdouble min, | ^~~~~~~~~~~~~~~~~~~~~~~~~ C:___GTK___gtk_hor_slider_test.c:36:3: warning: 'gtk_misc_set_alignment' is deprecated [-Wdeprecated-declarations] 36 | gtk_misc_set_alignment(GTK_MISC(label), 0.0, 1); | ^~~~~~~~~~~~~~~~~~~~~~ In file included from C:/msys64/mingw64/include/gtk-3.0/gtk/gtklabel.h:32, from C:/msys64/mingw64/include/gtk-3.0/gtk/gtkaccellabel.h:35, from C:/msys64/mingw64/include/gtk-3.0/gtk/gtk.h:33, from C:___GTK___gtk_hor_slider_test.c:1: C:/msys64/mingw64/include/gtk-3.0/gtk/deprecated/gtkmisc.h:72:6: note: declared here 72 | void gtk_misc_set_alignment (GtkMisc *misc, | ^~~~~~~~~~~~~~~~~~~~~~ C:___GTK___gtk_hor_slider_test.c:36:3: warning: 'gtk_misc_get_type' is deprecated [-Wdeprecated-declarations] 36 | gtk_misc_set_alignment(GTK_MISC(label), 0.0, 1); | ^~~~~~~~~~~~~~~~~~~~~~ In file included from C:/msys64/mingw64/include/gtk-3.0/gtk/gtklabel.h:32, from C:/msys64/mingw64/include/gtk-3.0/gtk/gtkaccellabel.h:35, from C:/msys64/mingw64/include/gtk-3.0/gtk/gtk.h:33, from C:___GTK___gtk_hor_slider_test.c:1: C:/msys64/mingw64/include/gtk-3.0/gtk/deprecated/gtkmisc.h:70:9: note: declared here 70 | GType gtk_misc_get_type (void) G_GNUC_CONST; | ^~~~~~~~~~~~~~~~~ C:___GTK___gtk_hor_slider_test.c:41:3: warning: 'gtk_alignment_new' is deprecated [-Wdeprecated-declarations] 41 | halign = gtk_alignment_new(0, 0, 0, 0); | ^~~~~~ In file included from C:/msys64/mingw64/include/gtk-3.0/gtk/gtk.h:255, from C:___GTK___gtk_hor_slider_test.c:1: C:/msys64/mingw64/include/gtk-3.0/gtk/deprecated/gtkalignment.h:79:12: note: declared here 79 | GtkWidget* gtk_alignment_new (gfloat xalign, | ^~~~~~~~~~~~~~~~~ Build finished with warning(s). Terminal will be reused by tasks, press any key to close it.
..
附录
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**这是 STACKOVERFLOW 上的经典文章, 实际上它适合所有人而不仅仅是程序猿
搜索,并研究
...并记录你找到的东西。即使你在网站的其他地方没有找到有用的答案,包括没有帮助的相关问题的链接可以帮助其他人了解你的问题与其他问题的不同之处。
写一个能概括具体问题的标题
标题是潜在回答者看到的第一件事,如果你的标题不有趣,他们就不会阅读其他内容。所以要让它发挥作用。
假设你在和一个忙碌的同事谈话,并且必须用一句话来总结你的整个问题:你可以包括哪些细节来帮助别人识别和解决你的问题?包括任何错误信息、关键API或不寻常的情况,使你的问题与网站上已有的类似问题不同。
拼写、语法和标点符号都很重要!
记住,这是你的问题的第一部分,别人会看到 - 你想给人留下一个好印象。如果你不习惯用英语写作,可以请一个朋友为你校对。
如果你在总结问题时遇到困难,就把标题写在最后--有时先写问题的其余部分可以使你更容易描述问题。
例子:
Examples: Bad: C# Math Confusion Good: Why does using float instead of int give me different results when all of my inputs are integers? Bad: [php] session doubt Good: How can I redirect users to different pages based on session data in PHP? Bad: android if else problems Good: Why does str == "value" evaluate to false when str is set to "value"?
【糟糕的】C#数学的困惑?
【好的】 当我的输入都是整数时,为什么使用float而不是int会得到不同的结果?
【糟糕的】 [php]会话疑问
【好的】如何在PHP中根据会话数据将用户重定向到不同的页面?
【糟糕的】android if else问题
【好的】 当str被设置为 "value "时,为什么str == "value "评估为false?
在你发布任何代码之前,先介绍一下这个问题
在问题的正文中,首先扩展你在标题中的总结。
解释你是如何遇到你要解决的问题的,以及妨碍你自己解决这个问题的任何困难。你的问题中的第一段是大多数读者会看到的第二件事,所以要尽可能让它具有吸引力和信息性。
帮助他人重现该问题
不是所有的问题都能从包括代码中受益,但如果你的问题是关于你写的代码,你应该包括一些。但是,不要只是复制你的整个程序!这不仅可能使你的问题得到解决,也可能使你的问题得到解决。如果你发布的是你雇主的代码,这不仅可能给你带来麻烦,而且可能包括许多不相关的细节,读者在试图重现问题时需要忽略这些细节。这里有一些准则。
在
http://sqlfiddle.com/
或
http://jsbin.com/
但也要把代码复制到问题本身。不是每个人都能访问外部网站,而且链接可能会随着时间的推移而中断。使用Stack Snippets来制作内联JavaScript/HTML/CSS的实时演示。
包括所有相关的标签
尽量为你的问题所涉及的语言、库和特定的API包含一个标签。如果你开始在标签字段中输入,系统会建议与你输入的内容相匹配的标签--请确保阅读这些标签的描述,以确保它们与你所问的问题有关 另请参见。什么是标签,以及我应该如何使用它们?
发布前要进行校对!
现在你已经准备好提出你的问题了,深吸一口气,从头到尾读一遍。
假装你是第一次看到它:它有意义吗?
试着在一个新的环境中自己重现这个问题,并确保你能只用你问题中包含的信息来做。添加任何你遗漏的细节,并再次通读它。现在是一个很好的时间来确保你的标题仍然描述了这个问题!
发布问题并回应反馈
发布后,让问题在你的浏览器中打开一会儿,看看是否有人评论。如果你错过了一个明显的信息,请准备好通过编辑你的问题来回应,以包括它。如果有人发布了答案,请准备好试用并提供反馈意见
寻找帮助,寻求帮助
尽管你做了所有的努力,你可能发现你的问题没有得到很好的回应。
不要感到绝望!
学习提出一个好的问题是一个值得追求的目标,而不是一夜之间就能掌握的。这里有一些额外的资源,你可能会觉得有用。