Linux下静态编译win32的GTK程序

首先感谢hangyu网友分享的GTK静态库。
原帖地址:http://forum.ubuntu.org.cn/viewtopic.php?f=162&t=354286

下载地址:http://code.google.com/p/static-gtk2-mingw32/

先说一下在Windows下编译的方法。

解压文件,然后进入解压后的bin目录执行命令:
pkg-config.exe –libs –cflags “gtk+-2.0”
如果出现以下错误
Package gtk+-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `gtk+-2.0.pc’
to the PKG_CONFIG_PATH environment variable
No package ‘gtk+-2.0’ found
则先执行命令:set PKG_CONFIG_PATH=你的解压路径\lib\pkgconfig 设置PKG_CONFIG_PATH环境变量

我得到的结果是:
-mms-bitfields -IE:/Dev-Cpp/gtk+-2.0/include/gtk-2.0 -IE:/Dev-Cpp/gtk+-2.0/lib/gtk-2.0/include -IE:/Dev-Cpp/gtk+-2.0/include/atk-1.0 -IE:/Dev-Cpp/gtk+-2.0/include/cairo -IE:/Dev-Cpp/gtk+-2.0/include/gdk-pixbuf-2.0 -IE:/Dev-Cpp/gtk+-2.0/include/pango-1.0 -IE:/Dev-Cpp/gtk+-2.0/include/glib-2.0 -IE:/Dev-Cpp/gtk+-2.0/lib/glib-2.0/include -IE:/Dev-Cpp/gtk+-2.0/include/pixman-1 -IE:/Dev-Cpp/gtk+-2.0/include -IE:/Dev-Cpp/gtk+-2.0/include/freetype2 -I/gtk-dev/include/libpng14 -LE:/Dev-Cpp/gtk+-2.0/lib -L/gtk-dev/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -limm32 -lshell32 -luuid -latk-1.0 -lpangocairo-1.0 -lgio-2.0 -lshlwapi -ldnsapi -lgdk_pixbuf-2.0 -ltiff -ljpeg -ljasper -lpangoft2-1.0 -lpangowin32-1.0 -lusp10 -lfontconfig -lexpat -lpango-1.0 -lcairo -lpixman-1 -lfreetype -lmsimg32 -lgdi32 -lpng -lz -lm -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl -liconv -lws2_32 -lole32

记得保存这个结果,作为编译时的参数在后面要用到。
然后编译一个程序试试,将以下代码保存为test.c文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <gtk/gtk.h>
int main(int argc,char *argv[]){
GtkWidget *window, *label;
gtk_init(&argc,&argv);
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window),"Hellow World");
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
label = gtk_label_new("龙昌博客:http://www.xefan.com");
gtk_container_add (GTK_CONTAINER (window), label);
gtk_widget_show_all(window);
gtk_main();
return 0;
}

执行命令进行编译:
gcc -o test.exe test.c -mms-bitfields -IE:/Dev-Cpp/gtk+-2.0/include/gtk-2.0 -IE:/Dev-Cpp/gtk+-2.0/lib/gtk-2.0/include -IE:/Dev-Cpp/gtk+-2.0/include/atk-1.0 -IE:/Dev-Cpp/gtk+-2.0/include/cairo -IE:/Dev-Cpp/gtk+-2.0/include/gdk-pixbuf-2.0 -IE:/Dev-Cpp/gtk+-2.0/include/pango-1.0 -IE:/Dev-Cpp/gtk+-2.0/include/glib-2.0 -IE:/Dev-Cpp/gtk+-2.0/lib/glib-2.0/include -IE:/Dev-Cpp/gtk+-2.0/include/pixman-1 -IE:/Dev-Cpp/gtk+-2.0/include -IE:/Dev-Cpp/gtk+-2.0/include/freetype2 -I/gtk-dev/include/libpng14 -LE:/Dev-Cpp/gtk+-2.0/lib -L/gtk-dev/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -limm32 -lshell32 -luuid -latk-1.0 -lpangocairo-1.0 -lgio-2.0 -lshlwapi -ldnsapi -lgdk_pixbuf-2.0 -ltiff -ljpeg -ljasper -lpangoft2-1.0 -lpangowin32-1.0 -lusp10 -lfontconfig -lexpat -lpango-1.0 -lcairo -lpixman-1 -lfreetype -lmsimg32 -lgdi32 -lpng -lz -lm -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl -liconv -lws2_32 -lole32

如果不出错的话则生成一个test.exe的可执行文件。
如果没有gcc的话,可以下载安装一个MinGW程序,我之前用MinGW的gcc 4.4.0版本来编译结果出错了,然后换了个4.6版本的才能顺利编译,下载地址:http://nuwen.net/mingw.html

然后再介绍下在Linux下交叉编译的方法。

前一篇文章介绍了在Linux下交叉编译Windows程序的方法。现在只需把上面的参数的路径改下即可。

我的Windows的E盘在Linux下挂载到/mnt/Win_E ,再用上面的程序测试,执行命令:
i486-mingw32-gcc -o test.exe test.c -mms-bitfields -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include/gtk-2.0 -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/lib/gtk-2.0/include -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include/atk-1.0 -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include/cairo -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include/gdk-pixbuf-2.0 -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include/pango-1.0 -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include/glib-2.0 -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/lib/glib-2.0/include -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include/pixman-1 -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include -I/mnt/Win_E/Dev-Cpp/gtk+-2.0/include/freetype2 -I/gtk-dev/include/libpng14 -L/mnt/Win_E/Dev-Cpp/gtk+-2.0/lib -L/gtk-dev/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -limm32 -lshell32 -luuid -latk-1.0 -lpangocairo-1.0 -lgio-2.0 -lshlwapi -ldnsapi -lgdk_pixbuf-2.0 -ltiff -ljpeg -ljasper -lpangoft2-1.0 -lpangowin32-1.0 -lusp10 -lfontconfig -lexpat -lpango-1.0 -lcairo -lpixman-1 -lfreetype -lmsimg32 -lgdi32 -lpng -lz -lm -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl -liconv -lws2_32 -lole32

然后生成 test.exe文件,可以用wine来测试下是否可用。

这个生成的文件好像有点大了,随便一个都是25M以上。使用命令:
i486-mingw32-strip hellow.exe
一下子可以减到7M左右。

linux下交叉编译windows程序

有时候需要编写在Windows下运行的程序,但是又不想切换到Windows下来编译,于是就想在Linux下来编译Windows下运行的exe文件。

这个需要先安装mingw32交叉编译工具。
ubuntu下使用命令:sudo apt-get install mingw32进行安装,
Arch Linux下使用命令:sudo pacman -S mingw32-binutils mingw32-gcc mingw32-pthreads mingw32-runtime mingw32-w32api

安装完后测试一下效果。
将以下代码保存为mingw32_test.c文件。

1
2
3
4
5
int main(int argc, char *argv)
{
printf("Windows Compiler Test\nhttp://www.xefan.com\n");
return 0;
}

然后执行命令:

[lcj@lcj C]$ i486-mingw32-gcc -o mingw32_test.exe mingw32_test.c
mingw32_test.c: In function 'main':
mingw32_test.c:3:5: warning: incompatible implicit declaration of built-in function 'printf' [enabled by default]
[lcj@lcj C]$ wine mingw32_test.exe
Windows Compiler Test
http://www.xefan.com
[lcj@lcj C]$

经测试在wine下能正常运行,在虚拟机里的WinXP下测试也可正常运行。

Linux NFS服务器设置

我用的是Arch Linux,不过不同的版本应该都差不多吧。

1、首先安装nfs-utils软件包。

2、修改/ect/exports文件,添加分享,格式为:
路径 允许的主机(属性)
如:/opt/arm 192.168.1.*(ro,sync,no_root_squash)

3、启动nfs服务。
执行命令:/etc/rc.d/nfs-server start

现在可以在其他主机上使用mount命令来挂载该主机的分享目录,命令格式:mount -t nfs -o nolock 主机:/路径 挂载点
如:mount -t nfs -o nolock 192.168.1.100:/opt/arm /mnt/nfs

如果挂载时出现提示:mount.nfs: access denied by server while mounting,说明请求被拒绝了。
修改/ect/hosts.allow文件(没有请自行创建),添加允许,格式
portmap: 主机/网段 :allow
如:
portmap: 192.168.1.100 :allow
portmap: 192.168.1.0/255.255.255.0 :allow

Linux samba服务器设置

我用的是Arch Linux,不过各个版本的Linux的设置应该都差不多吧。

1、首先安装samba。

2、/etc/samba/smb.conf为samba的配置文件,所有的修改操作都在此文件中进行。/etc/samba/smb.conf.default为配置模板,可以参照其进行配置。

例如要添加一项分享,可以修改/ect/samba/smb.conf文件,添加如下内容:

[printers]                                 #显示分享名
comment = All Printers
path = /var/spool/samba     #分享的路径
browseable = yes                    #允许浏览
# Set public = yes to allow user 'guest account' to print
guest ok = yes                         #允许匿名访问
writable = yes                          #可写
printable = yes

3、启动samba服务。
执行命令:/etc/rc.d/samba start

现在在Windows下可以直接在地址栏输入“\主机ip ”进行访问;在Linux下可以使用smbclient命令进行连接。

smbclient命令使用方法:
列出服务器上共享 #smbclient -L 机器IP -U 用户名%密码
例:#smbclient -L //192.168.1.100/ -U benson%1

登入samba #smbclient //机器IP/共享目录 -U 用户名称%密码
例:#smbclient //192.168.1.100/printers -U benson%1
登入成功后出现提示符 smb:/> ,接下来的操作和ftp时命令一样,用get下载文件而用put上传文件,命令可以用help查看。

使用Glade进行GTK开发

在前面的文章介绍了使用Glade进行PyGTK开发,现在再来说一说使用Glade来进行GTK的开发。

首先需要的开发环境:
Glade3、GTK+2.0、GCC

先用Glade设计一个用户界面,保存为test.glade,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.24"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<property name="resizable">False</property>
<property name="default_width">440</property>
<property name="default_height">450</property>
<signal name="destroy" handler="on_MainWindow_destroy" swapped="no"/>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="top_padding">10</property>
<property name="bottom_padding">10</property>
<property name="left_padding">10</property>
<property name="right_padding">10</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">龙昌博客: http://www.xefan.com</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">关闭</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_MainWindow_destroy" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>

再创建一个C源文件,保存为test.c,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <gtk/gtk.h>

void on_MainWindow_destroy(GtkObject *widget, gpointer data)
{
gtk_main_quit();
}

int main(int argc, char *argv[])
{
GtkBuilder *builder;
gtk_init(&argc, &argv);
GtkWidget *window;
builder = gtk_builder_new();
gtk_builder_add_from_file(builder, "test.glade", NULL);

window = GTK_WIDGET(gtk_builder_get_object(builder, "window1"));
gtk_builder_connect_signals(builder, NULL);
// 释放builder的空间
g_object_unref(G_OBJECT(builder));

gtk_widget_show_all(window);
gtk_main();
return 0;
}

然后再编译运行查看效果。
如果出现类似“Gtk-WARNING **: Could not find signal handler ‘on_MainWindow_destroy’”的错误请尝试以下方法:
方法一:将编译命令改为:gcc -o test test.c `pkg-config –libs –cflags gtk+-2.0` -export-dynamic
方法二:将编译命令改为:gcc -o test test.c `pkg-config –libs –cflags libglade-2.0 gmodule-export-2.0`

永中Office的ibus输入法问题

我在永中Office下无法调用ibus输入法,但是在其他窗口中都没有问题,如:gVIM,LeafPad,OpenOffice等等。我按照网上的方法在.bashrc文件中也添加了以下内容,可是还是不行。

export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus

正打算更换输入法时无意中发现了问题的所在。
首先用ps -e|grep ibus命令发现只有 ibus-daemon、ibus-gconf两个进程。
然后执行命令/usr/lib/ibus/ibus-x11 &,运行ibux-x11。 这时就有了 ibus-daemon、ibus-gconf、ibus-x11三个进程。此时在永中Office中可以正常使用ibus输入法了。

原来是ibus-x11没有运行的原因,如果不想每次都手动运行的话,可以将它设置为开机自动启动。

使用Glade进行PyGTK开发

使用Glade来进行GTK开发效率比较高,下面是一个例子。

将以下代码保存为test.glade文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
  <!--   文件名:test.glade  -->
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.24"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<property name="resizable">False</property>
<property name="default_width">440</property>
<property name="default_height">450</property>
<signal name="destroy" handler="on_MainWindow_destroy" swapped="no"/>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="top_padding">10</property>
<property name="bottom_padding">10</property>
<property name="left_padding">10</property>
<property name="right_padding">10</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">龙昌博客: http://www.xefan.com</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">关闭</property>
<property name="use_action_appearance">False</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<signal name="clicked" handler="on_MainWindow_destroy" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>

将以下代码保存为test.py文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/env python
# -*- encoding: UTF-8 -*-
##
# @文件名(file): test.py
# @作者(author): 龙昌锦(LongChangjin)
# @博客(blog): http://www.xefan.com
# @邮箱(mail): admin@xefan.com
# @QQ: 346202141
# @ICQ: wosuopu@gmail.com
# @时间(date): 2011-10-25
#
try:
import pygtk
pygtk.require(&quot;2.0&quot;)
except:
pass
try:
import gtk
import gtk.glade
except:
exit(1)

class GBuilder:
def delete_event(self,widget,event,data=None):
return gtk.FALSE
def on_MainWindow_destroy(self,widget,data=None):
gtk.main_quit()
def __init__(self):
#初始化 gtkbuilder
builder = gtk.Builder()
#设置 glade文件
builder.add_from_file(&quot;test.glade&quot;)
#连接 glade文件中的signals
builder.connect_signals(self)

#小部件
self.button1 = builder.get_object(&quot;button1&quot;)
#获取主窗口
self.window = builder.get_object(&quot;window1&quot;)
self.window.show()

if __name__ == &quot;__main__&quot;:
window=GBuilder()
gtk.main()

然后运行查看效果。

用PyGTK创建Dialog对话框

PyGTK创建Dialog的函数如下:
gtk.Dialog(title=None, parent=None, flags=0, buttons=None)

原文地址:http://www.pygtk.org/docs/pygtk/class-gtkdialog.html#constructor-gtkdialog

下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python
# -*- coding:UTF-8 -*-
import gtk

label = gtk.Label(u&quot;龙昌博客 http://www.xefan.com&quot;)
dialog = gtk.Dialog(u&quot;测试对话框&quot;,
None,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,
gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
dialog.vbox.pack_start(label)
label.show()
checkbox = gtk.CheckButton(&quot;Useless checkbox&quot;)
dialog.action_area.pack_end(checkbox)
checkbox.show()
response = dialog.run()
dialog.destroy()
if response == gtk.RESPONSE_ACCEPT.real:
print u&quot;确定&quot;
if response == gtk.RESPONSE_REJECT.real:
print u&quot;取消&quot;

Arch Linux安装xfce和slim

这几天终于把Arch Linux + Xfce + slim配置好了,做个笔记备忘。

安装Xfce


https://wiki.archlinux.org/index.php/Xfce_(简体中文)

安装准备

请在安装与使用xfce前确认已经安装有xorg以及hal。

# pacman -S xorg hal

默认安装的archlinux是不包含xorg以及hal的。如果不安装两者,将造成xfce无法启动。HAL 已经被诸如udev,udisks,upower这些程序替代 。

安装XFCE系统(Xfce 4.8)

# pacman -S xfce4 xfce4-goodies
# pacman -S $(pacman -Sgq xfce4-goodies | grep -v xfce4-xfapplet-plugin)

默认安装的xfce4,首次启动出现的小提示窗口里面是没有任何东西的。如果你想看到刚启动时候的技巧和小提示,那么就需要安装fortune-mod

# pacman -S fortune-mod

安装好xfce4之后可能会发现xfce4-mixer通过ALSA并不能控制音量,需要安装gstreamer0.10-base-plugins:

# pacman -S gstreamer0.10-base-plugins

对于笔记本用户,Xfce4-mixer如果不能同时控制外放与耳机,请尝试安装全部Plugins:

# pacman -S gstreamer0.10-plugins

安装和配置Daemons

安装dbus:

# pacman -S dbus

需要在开机的时候自动运行,应该将dbus添加到/etc/rc.conf文件中的DAEMONS:
DAEMONS=(syslog-ng dbus network crond)

如果不想重启开始dbus服务: # /etc/rc.d/dbus start

安装gamin (fam已经是过时的东西),它会在后台自动运行检查文件改动反应给桌面,并且不需要添加到Daemons。

# pacman -S gamin

运行XFCE

手动启动

你只需要运行: $ startxfce4

从终端启动,例如使用xinit/startx 需要配置Xinitrc (简体中文)。
如果还没有~/.xinitrc 文件,系统里有一份实例文件供参考:$ cp /etc/skel/.xinitrc ~/.xinitrc

在最后添加(因为权限的问题推荐在启动xfce之前添加ck-launch-session dbus-launch启):
exec ck-launch-session dbus-launch –exit-with-session startxfce4

在XFCE中关机和重启

在/etc/sudoers文件末尾添加如下一行:
%users ALL=(root) NOPASSWD: /usr/lib/xfce4/session/xfsm-shutdown-helper

# gpasswd -a 你的用户名 users

声音
安装ALSA
https://wiki.archlinux.org/index.php/Advanced_Linux_Sound_Architecture_(简体中文)

要求有本地化的ALSA程序和管理

# pacman -S alsa-lib alsa-utils
# pacman -S alsa-oss

所有ALSA程序都很可能需要依赖alsa-lib。

使用ALSA驱动如何让xfce4-mixer来控制音量

新版的xfce4-mixer使用了gstreamer作为后端,这样就不用直接与驱动交流,更加统一。与驱动打交道的工作交给了gstreamer。因此如果你xfce4-mixer无法正常工作,就需要配置好gstreamer。首先当然你得安装xfce4-mixer。

pacman -S xfce4-mixer gstreamer0.10-base-plugins

你需要至少安装gstreamer0.10-good-plugins,考虑安装gstreamer0.10-bad-plugins

pacman -S gstreamer0.10-good-plugins gstreamer0.10-bad-plugins

然后删除面板上的mixer插件,然后重新添加一次,或者先登出然后再登录一次,对gstreamer做更改后必须这样做才能让操作生效。

安装SLiM


https://wiki.archlinux.org/index.php/SLiM_(简体中文)

介绍

SLiM是Simple Login Manager(简单登录管理器)的缩写。SLiM是简单、轻量级和容易配置的,相对较易在低端和高端的系统中使用。对于那些希望寻找一个不依赖于GNOME或者KDE,可以在Xfce、Openbox、Fluxbox等环境下使用的登录管理器的人来说,SLiM也是非常合适的。

安装

可以在extra软件仓库中找到SLiM: # pacman -S slim

同时还可以安装主题包: # pacman -S slim-themes archlinux-themes-slim

配置

启用SLiM

单用户环境
要将SLiM配置为加载某个特定的环境,只需编辑~/.xinitrc如下:
将[session-command]替换为适当的会话命令。例如:
要启动Xfce:
exec ck-launch-session dbus-launch –exit-with-session startxfce4

打开 /etc/rc.conf。
# vi /etc/rc.conf

添加一个服务slim
DAEMONS=(syslogd klogd !pcmcia network netfs crond slim)

修改默认运行等级

  1. 切换用户到root.
    $ su
  2. 编辑/etc/inittab:
    # vi /etc/inittab
  3. 找到如下这一行:
    id:3:initdefault:
  4. 为了启动X11需要把’3’修改成’5’:
    id:5:initdefault:
  5. 保存此文件并退出编辑器,下次启动时你选择的显示管理器就会运行了。

这样就差不多了,细节上的以后再慢慢琢磨。