0%

安装MinGW工具链环境

  • 这里在Win32环境下要安装一个MinGW工具链,这里最好是先安装一个Qt环境,使用Qt自带的MinGW工具链,我这里是先安装一个Qt5.6的环境再用它来编译Qt5.3.2的静态库.下载并安装ActivePerl软件.

  • 这里要用到MSYS环境,把编译ICU,opensslgcc都指向QT5.6.1自带的工具链GCC,这样才能保能Qt,ICU,openssl编译出来的C++二进制文是兼容的,修改msys_env.bat脚本如下:

    1
    2
    3
    4
    set path=C:\Python27;C:\Perl\bin;C:\Qt\Qt5.6.1\Tools\mingw492_32\bin;D:\mingw\bin;
    D:\mingw\mingw32\bin;D:\mingw\msys\1.0\bin
    set HOME=D:\mingw\msys\1.0
    bash.exe
  • 修改fstab文件,这里从StackOverFlow
    看到解释

1
2
C:/Qt/Qt5.6.1/Tools/mingw492_32  /mingw
c:/perl/Perl

下载ICU

下载编译ICU

  • 下载ICU4C_53_1
  • 这里以icu-53_1为例编译 解压ICU包进入到source目录
1
2
3
4
5
bash.exe-3.1$ cd icu/source
bash.exe-3.1$ ./runConfigureICU MinGW --prefix=/c/icu4c53_1 --enable-static --disable-shared
--enable-release --disable-debug
[...]
bash.exe-3.1$ make && make install

编译openssl

  • 下载 https://www.openssl.org/source/openssl-1.0.1g.tar.gz
  • 编译openssl 必需要有msys环境.请仔细查看解压后文件夹里的INSTALL.W32文档.
  • 运行msys shell ,切换的openssl-1.0.1g目录下:
    1
    2
    3
    4
    5
    6
    7
    bash.exe-3.1$  ./config --prefix=/c/openssl-1.0.1g no-asm no-shared
    [...]
    bash.exe-3.1$ make depend
    [...]
    bash.exe-3.1$ make
    [...]
    bash.exe-3.1$ make install

编译Qt源码

  • 下载Qt5.3.2
  • 解压文件并且修改qtbase\mkspecs\win32-g++\qmake.conf最终文件如下:
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    # qmake configuration for win32-g++
    #
    # Written for MinGW / gcc 4.6 or higher
    #
    # Cross compile example for i686-w64-mingw32-g++:
    # configure -xplatform win32-g++ -device-option CROSS_COMPILE=i686-w64-mingw32-
    #
    load(device_config)
    MAKEFILE_GENERATOR = MINGW
    QMAKE_PLATFORM = win32 mingw
    CONFIG += debug_and_release debug_and_release_target precompile_header
    DEFINES += UNICODE
    QMAKE_COMPILER_DEFINES += __GNUC__ WIN32
    QMAKE_EXT_OBJ = .o
    QMAKE_EXT_RES = _res.o
    QMAKE_COMPILER = gcc
    QMAKE_CC = $${CROSS_COMPILE}gcc
    QMAKE_LEX = flex
    QMAKE_LEXFLAGS =
    QMAKE_YACC = byacc
    QMAKE_YACCFLAGS = -d
    QMAKE_CFLAGS = -pipe -fno-keep-inline-dllexport
    QMAKE_CFLAGS_DEPS = -M
    QMAKE_CFLAGS_WARN_ON = -Wall -Wextra
    QMAKE_CFLAGS_WARN_OFF = -w
    QMAKE_CFLAGS_RELEASE -= -O2
    QMAKE_CFLAGS_RELEASE += -Os -momit-leaf-frame-pointer #注意这一行
    QMAKE_CFLAGS_DEBUG = -g
    QMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
    QMAKE_CFLAGS_SPLIT_SECTIONS = -ffunction-sections
    QMAKE_CFLAGS_SSE2 = -msse2 -mstackrealign
    QMAKE_CFLAGS_SSE3 = -msse3
    QMAKE_CFLAGS_SSSE3 = -mssse3
    QMAKE_CFLAGS_SSE4_1 = -msse4.1
    QMAKE_CFLAGS_SSE4_2 = -msse4.2
    QMAKE_CFLAGS_AVX = -mavx
    QMAKE_CFLAGS_AVX2 = -mavx2
    QMAKE_CFLAGS_IWMMXT = -mcpu=iwmmxt
    QMAKE_CFLAGS_NEON = -mfpu=neon
    QMAKE_CXX = $${CROSS_COMPILE}g++
    QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
    QMAKE_CXXFLAGS_DEPS = $$QMAKE_CFLAGS_DEPS
    QMAKE_CXXFLAGS_WARN_ON = $$QMAKE_CFLAGS_WARN_ON
    QMAKE_CXXFLAGS_WARN_OFF = $$QMAKE_CFLAGS_WARN_OFF
    QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE
    QMAKE_CXXFLAGS_DEBUG = $$QMAKE_CFLAGS_DEBUG
    QMAKE_CXXFLAGS_YACC = $$QMAKE_CFLAGS_YACC
    QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
    QMAKE_CXXFLAGS_RTTI_ON = -frtti
    QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti
    QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads
    QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
    QMAKE_CXXFLAGS_CXX11 = -std=c++0x
    QMAKE_CXXFLAGS_SPLIT_SECTIONS = $$QMAKE_CFLAGS_SPLIT_SECTIONS
    QMAKE_INCDIR =
    QMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src
    QMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
    QMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
    QMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
    QMAKE_LINK = $${CROSS_COMPILE}g++
    QMAKE_LINK_C = $${CROSS_COMPILE}gcc
    QMAKE_LFLAGS = -static -static-libgcc # 添加这一行
    QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads
    QMAKE_LFLAGS_EXCEPTIONS_OFF =
    QMAKE_LFLAGS_RELEASE = -Wl,-s
    QMAKE_LFLAGS_DEBUG =
    QMAKE_LFLAGS_CONSOLE = -Wl,-subsystem,console
    QMAKE_LFLAGS_WINDOWS = -Wl,-subsystem,windows
    QMAKE_LFLAGS_DLL = -static
    QMAKE_LFLAGS_CXX11 =
    QMAKE_LFLAGS_GCSECTIONS = -Wl,--gc-sections
    QMAKE_LINK_OBJECT_MAX = 10
    QMAKE_LINK_OBJECT_SCRIPT = object_script
    QMAKE_PREFIX_STATICLIB = lib
    QMAKE_EXTENSION_STATICLIB = a
    QMAKE_LIBS =
    QMAKE_LIBS_CORE = -lole32 -luuid -lws2_32 -ladvapi32 -lshell32 -luser32 -lkernel32
    QMAKE_LIBS_GUI = -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lws2_32 -lole32 -luuid -luser32 -ladvapi32
    QMAKE_LIBS_NETWORK = -lws2_32
    QMAKE_LIBS_OPENGL = -lglu32 -lopengl32 -lgdi32 -luser32
    QMAKE_LIBS_OPENGL_ES2 = -llibEGL -llibGLESv2 -lgdi32 -luser32
    QMAKE_LIBS_OPENGL_ES2_DEBUG = -llibEGLd -llibGLESv2d -lgdi32 -luser32
    QMAKE_LIBS_COMPAT = -ladvapi32 -lshell32 -lcomdlg32 -luser32 -lgdi32 -lws2_32
    QMAKE_LIBS_QT_ENTRY = -lmingw32 -lqtmain
    !isEmpty(QMAKE_SH) {
    MINGW_IN_SHELL = 1
    QMAKE_DIR_SEP = /
    QMAKE_DIRLIST_SEP = :
    include(../common/shell-unix.conf)
    # Because install's ability to set permissions is not relevant on Windows,
    # and git's msys does not provide it to start with.
    QMAKE_INSTALL_FILE = cp -f
    QMAKE_INSTALL_PROGRAM = cp -f
    } else {
    include(../common/shell-win32.conf)
    }
    QMAKE_IDL = midl
    QMAKE_LIB = $${CROSS_COMPILE}ar -ru
    QMAKE_RC = $${CROSS_COMPILE}windres
    QMAKE_STRIP = $${CROSS_COMPILE}strip
    QMAKE_STRIPFLAGS_LIB += --strip-unneeded
    QMAKE_OBJCOPY = $${CROSS_COMPILE}objcopy
    QMAKE_NM = $${CROSS_COMPILE}nm -P
    load(qt_config)

创建编译脚本

  • 创建一个bat的脚本件内容如下,有些变量请按实际系统环境做相应的修改.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
set RDIR=c:/Qt/Qt5.6.1
set VERGCC=mingw492_32
set PATH=C:/Python27;C:/Perl/bin;%RDIR%/5.6/%VERGCC%/bin;%RDIR%/Tools/%VERGCC%/bin;C:\icu\bin;%RDIR%/Tools/QtCreator/bin
set INCLUDE=%RDIR%/5.6/%VERGCC%/include;%RDIR%/Tools/%VERGCC%/include;C:\icu4c53_1\include;C:\openssl-1.0.1g\include
set LIB=%RDIR%/5.6/%VERGCC%/lib;%RDIR%/Tools/%VERGCC%/lib;C:\icu4c53_1\lib;C:\openssl-1.0.1g\lib
set SDIR=D:/qt-everywhere-opensource-src-5.3.2
cd %SDIR%
configure.bat -mp -platform win32-g++ -opensource -confirm-license -release
-static -ltcg -c++11 -prefix "c:/Qt/5.3.2-static" -accessibility
-rtti -qt-sql-sqlite -qt-sql-odbc -plugin-sql-sqlite -plugin-sql-odbc -icu -qt-zlib -qt-libpng -qt-libjpeg
-audio-backend -opengl desktop -qml-debug -no-vcproj -no-dbus -nomake tests
-openssl -I C:/openssl-1.0.1g/include -L C:/openssl-1.0.1g/lib
-nomake examples -qt-freetype -no-compile-examples -no-openvg -iconv -no-directwrite
-no-iwmmxt -no-crt -skip qtwebkit
;编译
mingw32-make
;安装到-prefix的变量路径中
mingw32-make install

谢谢支持

软件硬件配置

OpenOCD

  • 这里省略下载编译 opencd 环节.

  • openocd 安装在/usr/local 下

  • /usr/local/bin/openocd

  • 配置文件目录

  • /usr/local/share/openocd/

  • 在当前用户目录下创建一个.openocd目录

  • 添加下面三行到~/.openocd/openocd.cfg

1
2
3
source [find /usr/local/share/openocd/scripts/interface/stlink-v2.cfg]
source [find /usr/local/share/openocd/scripts/target/stm32f4x.cfg]
reset_config srst_only srst_nogate
  • 连接 STM32F4 开发板,运行/usr/local/bin/openocd
  • 正常会出现下面信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

michael@debian:~$ /usr/local/bin/openocd
Open On-Chip Debugger 0.10.0-dev-00146-g332023f (2015-12-05-18:09)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "hla_swd". To override use 'transport select <transport>'.
Info : The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD
adapter speed: 2000 kHz
adapter_nsrst_delay: 100
none separate
srst_only separate srst_nogate srst_open_drain connect_deassert_srst
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
Info : Unable to match requested speed 2000 kHz, using 1800 kHz
Info : clock speed 1800 kHz
Info : STLINK v2 JTAG v24 API v2 SWIM v0 VID 0x0483 PID 0x3748
Info : using stlink api v2
Info : Target voltage: 2.881129
Info : stm32f4x.cpu: hardware has 6 breakpoints, 4 watchpoints

1
2
3
4
5
6
~$ git clone https://github.com/texane/stlink.git
~$ cd STLink
~$ ./authorgen.sh
~$ ./configure --prefix=/opt/STLink
~$ make && sudo make install
~$ sudo cp 49-stlinkv2.rules /etc/udev/rules.d/49-stlinkv2.rules
  • 通过 lsusb 命令找出开板板的 ID
1
2
3
$ lsusb
Bus 001 Device 002: ID 0483:3748 STMicroelectronics ST-LINK/V2
Bus 003 Device 010: ID 174c:5106 ASMedia Technology Inc. Transcend StoreJet 25M3
  • 修改/etc/udev/rules.d/49-stlinkv2.rules,注意 ATTRS{idProduct}==“3748”
1
2
3
4
5
6
7
8
9
10
11
12
13

$ cat /etc/udev/rules.d/49-stlinkv2.rules
# stm32 discovery boards, with onboard st/linkv2
# ie, STM32L, STM32F4.
# STM32VL has st/linkv1, which is quite different
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", \
MODE:="0666", \
SYMLINK+="stlinkv2_%n",OWNER="michael"
# If you share your linux system with other users, or just don't like the
# idea of write permission for everybody, you can replace MODE:="0666" with
# OWNER:="yourusername" to create the device owned by you, or with
# GROUP:="somegroupname" and mange access using standard unix groups.

刷新系统规则

1
2
3
4

~$ sudo udevadm control --reload-rules
~$ sudo udevadm trigger

GCC ARM Embedded

  • 下载 GCC 工具链解压到/home/user/Embedded-System/gcc-arm-none-eabi-4_9-2015q3,并且把/home/user/Embedded-System/gcc-arm-none-eabi-4_9-2015q3/bin 添加系统环境变量里面

Codeblocks 配置

  • 安装相应平台的 codeblocks 二进制包.
  • 打开Settings->Editor->Code completion . 设置如下图.
    codecompletion.png

编译器的全局设置

  • 设置 ARM 工具链的路径,根据自己的环境做相应改变,如下图所示.
    compiler_settings.png

  • 工具链头文件设置,如下图所示.
    compiler_settings_inc.png

  • 工具链库文件设置,如下图所示.
    compiler_settings_lib.png

STM32 工程设置

  • 这里是针对 STM32F4 Discovery 开发板,工程设置的一些参数

  • 编译选项设置,如下图所示.

  • 设置基于特定 CPU 的 CFLAGS 参数.-mthumb -mthumb-interwork -mlittle-endian -O2 -Wall -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -DUSE_STDPERIPH_DRIVER -DSTM32F4XX -std=c99

project_options.png

  • 编译宏定义设置,如下图所示.
    project_define.png

  • 链接选项设置,如下图所示.
    project_link.png

  • 工程头文件查找目录,库文件查找目录.

project_inc.png
project_search_link.png

  • 结合 openocd 自动烧写 bin 文件的设置,如下图所示.
    project_shell.png

  • 工程中的自动烧写脚本文件.

1
2
3
4
5
6
7
8
9
10
11
12
13
14

#!/usr/bin/expect
spawn telnet localhost 4444
set prompt ">"
set hexf [lindex $argv 0];
interact -o -nobuffer -re $prompt return
send "reset halt\r"
interact -o -nobuffer -re $prompt return
send "flash write_image erase unlock $hexf\r"
interact -o -nobuffer -re $prompt return
send "reset run\r"
interact -o -nobuffer -re $prompt return
send "exit\r"
interact

project_shfile.png

  • 因为 GCC 工具链与 Keil 的链接文件是一样,必须在下面这个 LD 文件上修改,不能使用 Keil 版本的链接文件.
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
/*
*****************************************************************************
**
** File : stm32_flash.ld
**
** Abstract : Linker script for STM32F407VG Device with
** 1024KByte FLASH, 192KByte RAM
**
** Set heap size, stack size and stack location according
** to application requirements.
**
** Set memory bank area and size if external memory is used.
**
** Target : STMicroelectronics STM32
**
** Environment : Atollic TrueSTUDIO(R)
**
** Distribution: The file is distributed “as is,” without any warranty
** of any kind.
**
** (c)Copyright Atollic AB.
** You may use this file as-is or modify it according to the needs of your
** project. Distribution of this file (unmodified or modified) is not
** permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the
** rights to distribute the assembled, compiled & linked contents of this
** file as part of an application binary file, provided that it is built
** using the Atollic TrueSTUDIO(R) toolchain.
**
*****************************************************************************
*/
/* Entry Point */
ENTRY(Reset_Handler)
/* Highest address of the user mode stack */
_estack = 0x20020000; /* end of 128K RAM on AHB bus*/
/* Generate a link error if heap and stack don\'t fit into RAM */
_Min_Heap_Size = 0; /* required amount of heap */
_Min_Stack_Size = 0x400; /* required amount of stack */

/* Specify the memory areas */
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K
MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K
}
/* Define output sections */
SECTIONS
{
/* The startup code goes first into FLASH */
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >FLASH
/* The program code and other data goes into FLASH */
.text :
{
. = ALIGN(4);
*(.text) /* .text sections (code) */
*(.text*) /* .text* sections (code) */
*(.rodata) /* .rodata sections (constants, strings, etc.) */
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
*(.glue_7) /* glue arm to thumb code */
*(.glue_7t) /* glue thumb to arm code */
*(.eh_frame)
KEEP (*(.init))
KEEP (*(.fini))
. = ALIGN(4);
_etext = .; /* define a global symbols at end of code */
_exit = .;
} >FLASH
.ARM.extab :
{ *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
.ARM :
{
__exidx_start = .;
*(.ARM.exidx*)
__exidx_end = .;
} >FLASH

.preinit_array :
{
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP (*(.preinit_array*))
PROVIDE_HIDDEN (__preinit_array_end = .);
} >FLASH
.init_array :
{
PROVIDE_HIDDEN (__init_array_start = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array*))
PROVIDE_HIDDEN (__init_array_end = .);
} >FLASH
.fini_array :
{
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(.fini_array*))
KEEP (*(SORT(.fini_array.*)))
PROVIDE_HIDDEN (__fini_array_end = .);
} >FLASH

/* used by the startup to initialize data */
_sidata = .;

/* Initialized data sections goes into RAM, load LMA copy after code */
.data :
AT ( _sidata )
{
. = ALIGN(4);
_sdata = .; /* create a global symbol at data start */
*(.data) /* .data sections */
*(.data*) /* .data* sections */

. = ALIGN(4);
_edata = .; /* define a global symbol at data end */
} >RAM

/* Uninitialized data section */
. = ALIGN(4);
.bss :
{
/* This is used by the startup in order to initialize the .bss secion */
_sbss = .; /* define a global symbol at bss start */
__bss_start__ = _sbss;
*(.bss)
*(.bss*)
*(COMMON)

. = ALIGN(4);
_ebss = .; /* define a global symbol at bss end */
__bss_end__ = _ebss;
} >RAM

/* User_heap_stack section, used to check that there is enough RAM left */
._user_heap_stack :
{
. = ALIGN(4);
PROVIDE ( end = . );
PROVIDE ( _end = . );
. = . + _Min_Heap_Size;
. = . + _Min_Stack_Size;
. = ALIGN(4);
} >RAM

/* MEMORY_bank1 section, code must be located here explicitly */
/* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
.memory_b1_text :
{
*(.mb1text) /* .mb1text sections (code) */
*(.mb1text*) /* .mb1text* sections (code) */
*(.mb1rodata) /* read-only data (constants) */
*(.mb1rodata*)
} >MEMORY_B1

/* Remove information from the standard libraries */
/DISCARD/ :
{

libc.a ( * )
libm.a ( * )
libgcc.a ( * )
}

.ARM.attributes 0 :
{ *(.ARM.attributes) }
}

编译下载

  • 完成上述设置,每次编译完成后都会自动 telenet 连接到OpenOCD烧写最新的文件
  • 最终运行的效果如下图
    project_build.png

谢谢支持

  • MATE 桌面环境 是 GNOME 2 的一个分支,旨在使用传统的方式,为 Linux 用户提供一个有吸引力的和直观的桌面.

  • MATE 现在位于 GitHub:

安装 MATE 相关的软件包:

1
2
3
4
5
6
7
8
9
10
11
root# apt-get update && apt-get upgrade
root# apt-get install gir1.2-mate-panel libmate-desktop-2-17:amd64 libmate-desktop-doc libmate-menu2:amd64
libmate-panel-applet-4-1 libmate-window-settings1:amd64 libmatedict6 libmatekbd-common libmatekbd4:amd64
libmatepolkit-dev:amd64 libpolkit-gtk-mate-1-0:amd64 live-image-mate-desktop mate-applets mate-applets-common
mate-backgrounds mate-control-center mate-control-center-common mate-desktop mate-desktop-common
mate-gnome-main-menu-applet mate-icon-theme mate-icon-theme-faenza mate-media mate-media-common mate-media-pulse
mate-menus mate-netbook mate-panel mate-panel-common mate-polkit:amd64 mate-polkit-common mate-power-manager
mate-power-manager-common mate-screensaver mate-screensaver-common mate-sensors-applet mate-session-manager
mate-settings-daemon mate-settings-daemon-common mate-settings-daemon-pulse mate-system-monitor
mate-system-monitor-common mate-system-tools mate-system-tools-common mate-terminal mate-terminal-common
mate-themes mate-utils mate-utils-common
  • 安装 FVWM 相关软件包:
1
root# apt-get install fvwm{,-{crystal,icons}}

安装 Lightdm

  • LightDM 是一个跨桌面环境的显示管理器,其目的是为 X 窗口系统提供一个标准的显示管理器.它的特点有:

  • 代码轻量

  • 符合标准 (如 PAM, logind, 等)

  • 为用户提供一个良好的界面.

  • 跨桌面(用户可以使用各种各样的桌面环境).

1
2
root# apt-get install liblightdm-gobject-1-0 lightdm lightdm-gtk-greeter

  • 配置系统的Xsession, 这里要选择/usr/bin/mate-session :
1
2
3
4
5
6
7
8
root# update-alternatives --config x-session-manager
There are 2 choices for the alternative x-session-manager (providing /usr/bin/x-session-manager).

Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/openbox-session 40 auto mode
* 1 /usr/bin/mate-session 30 manual mode
2 /usr/bin/openbox-session 40 manual mode
  • 配置系统的X-window-manager,这里要选择/usr/bin/fvwm2
1
2
3
4
5
6
7
8
9
root# update-alternatives --config x-window-manager
There are 7 choices for the alternative x-window-manager (providing /usr/bin/x-window-manager).

Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/fvwm2 90 auto mode
1 /usr/bin/awesome 20 manual mode
2 /usr/bin/fvwm-crystal 50 manual mode

  • 如果不能正常启动lightdm,运行测试模式lightdm --test-mode -d,查看它的输出.

双屏幕设置

  • 安装x11-xserver-utils 包,这里要用到xrandr 去设置屏幕.
  • 获取屏幕的信息如下图所示.

  • 通过命令行设置.
1
$ xrandr --output HDMI1  --mode 1680x1050 --primary --output VGA1 --mode 1920x1080 --rotate left --right-of HDMI1
  • 最后效果图如下.

  • 也可以通过一个图形界面工具(arandr)去设置多屏幕,下面是我的笔记本外接一个 HDMI 的显示的图.

  • 不同分辩率的屏幕,设置不同的的缩放。
1
2
3
4
5
~$ xrandr --listmonitors
Monitors: 2
0: +*DVI-D-0 1920/509x1080/286+0+0 DVI-D-0
1: +HDMI-0 3840/597x2160/336+1920+0 HDMI-0

  • 如上图所示,HDMI-0连接的是一个4K屏,使用100%的显示,字体有一点小。使用--scale 0.5x0.5就变成了1920x1080.
1
~$ xrandr --output HDMI-0 --scale 0.5x0.5

谢谢支持

  • 微信二维码:

  • 欢迎访问我的博客,本博客是基于Hexo搭建.希望在此认识更多的朋友,相互学习与交流,联系作者.