build-essential的作用
我们在ubuntu上编译程序,默认是有gcc的,但是没有g++。
如果自己来安装g++也可以,不过它涉及到一些依赖库,有点麻烦。
现在有个叫build-essential的包,里面包含了很多开发必要的软件包,很全,很方便。
安装方法:apt-get install build-essential,
这个包里面有:
dpkg-dev fakeroot g++ g++-4.6 libalgorithm-diff-perl
libalgorithm-diff-xs-perl libalgorithm-merge-perl
libdpkg-perl libstdc++6-4.6-dev libtimedate-perl
libevent是事件驱动的网络库,事件驱动是他的核心,所以理解事件驱动对于理解整个网络库有很重要的意义。
Ubuntu 20.04 GUI 安装分步说明
step1:
sudo apt update sudo apt install tasksel
step2: tasksel
选择要安装的 GUI
对于其他 GUI 选择,执行以下命令:
$ tasksel --list-tasks
step3:
此时,您已选择要安装的 GUI,并记下了相关任务名称。接下来,使用命令安装所选GUI。例如,要安装默认的 Ubuntu GNOME 桌面执行:tasksel
$ sudo tasksel install ubuntu-desktop
step4:
重新启动系统:
$ reboot
step5:
此时,GUI 应开始。在登录之前,您可能需要在登录页面上选择所需的桌面风格。如果 GUI 未启动,请确保系统引导到图形,目标。要执行:
sudo systemctl set-default graphical.target
from:https://linuxconfig.org/ubuntu-20-04-gui-installation
设置MobaXterm内鼠标右键粘贴
1.打开MobaXterm,点击settings。
2.找到Paste using right-click,选择打钩,然后点ok。
3.重启,设置完成。
ubuntu下xvfb(虚拟屏幕)的使用
1.[服务器端]
sudo apt install xvfb x11vnc
Xvfb :screen-num -screen 0 1024x768x16 &
x11vnc -listen 0.0.0.0 -rfbport port -noipv6 -passwd passwd -display :screen-num
export DISPLAY=:screen-num
例如:
Xvfb :2 -screen 0 1024x768x16 &
x11vnc -listen 0.0.0.0 -rfbport 5900 -noipv6 -passwd xxxxxx -display :2
1024x768x16 是x,不是*
[用户端]
打开vncviewer等工具,连线即可,黑屏表示无东西显示。连接格式:“服务器ip:端口”。端口号密码即为前面所设。随便开点GUI程序即可。
使用自带的vnc服务总是会遇到各种的限制,所以还是使用x11vnc比较好,这个只是把主屏的内容直接传输过来,而不经过任何的权限管理方面的处理。
1.安装x11vnc
$ sudo apt-get install x11vnc
2.创建密码
$ x11vnc -storepasswd
Enter VNC password: *********
Verify password: *********
Write password to /home/xx/.vnc/passwd? [y]/n y
Password written to: /home/xx/.vnc/passwd
3.启动x11vnc
$ sudo x11vnc -auth guess -forever -loop -noxdamage -repeat -rfbauth /home/xx/.vnc/passwd -rfbport 5900 -shared
4.设置开机启动
$ sudo vi /etc/init/x11vnc.conf
# description "Start x11vnc on system boot"
description "x11vnc"
start on runlevel [2345]
stop on runlevel [^2345]
console log
respawn
respawn limit 20 5
exec /usr/bin/x11vnc -auth guess -forever -loop -noxdamage -repeat -rfbauth
/home/xx/.vnc/passwd -rfbport 5900 -shared
Xvfb -- 虚拟X server
主角:
Xvfb − virtual framebuffer X server for X Version 11
需要在服务器用一个基于 PyQt 的程序画图,而 PyQt 要求有 X server 支持。服务器上一般不会装 X Window的,这时候就轮到 Xvfb出场了!
对于 Xvfb 并不了解,我是在遇到问题后 google 到的解决方案,下面是官方的描述:
Xvfb is an X server that can run on machines with no display hardware and no physical input devices. It emulates a dumb framebuffer using virtual memory.
- 安装
- 启动 Xvfb
Xvfb -ac :7 -screen 0 1280x1024x8 > /dev/null 2>&1
export DISPLAY=:7
# DISPLAY 后的编号须与启动时的编号一致,这里是 ":7"。
之后就可以像在X Window中一样使用各种GUI程序了。
Python 中还有更原生的方式:PyVirtualDisplay
LLVM :LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
LLVM编译原理和使用
LLVM简介:
LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
LLVM最早的时候是Illinois的一个研究项目,主要负责人是Chris Lattner,他现在就职于Apple. Apple 目前也是llvm项目的主要赞助者之一。
在理解LLVM时,我们可以认为它包括了一个狭义的LLVM和一个广义的LLVM。广义的LLVM其实就是指整个LLVM编译器架构,包括了前端、后端、优化器、众多的库函数以及很多的模块;而狭义的LLVM其实就是聚焦于编译器后端功能(代码生成、代码优化、JIT等)的一系列模块和库。
LLVM优势:
传统编译器分三个阶段:
前端(Frontend)-- 优化器(Optimizer)-- 后端(Backend)
前端负责分析源代码,可以检查语法级错误,并构建针对语言的抽象语法树(AST);抽象语法树可以进一步转换为优化,最终转为新的表示方式,然后再交给让优化器和后端处理;
最终由后端生成可执行的机器码。
llvm也分三个阶段,但是设计上略微的有些区别, LLVM不同的就是对于不同的语言它都提供了同一种中间表示:
前端可以使用不同的编译工具对代码文件做词法分析以形成抽象语法树AST,然后将分析好的代码转换成LLVM的中间表示IR(intermediate representation);中间部分的优化器只对中间表示IR操作,通过一系列的pass对IR做优化;后端负责将优化好的IR解释成对应平台的机器码。LLVM的优点在于,中间表示IR代码编写良好,而且不同的前端语言最终都转换成同一种的IR。
为什么使用三段式设计?优势在哪里?首先解决一个很大的问题:假如有N种语言(C、OC、C++、Swift...)的前端,同时也有M个架构(模拟器、arm64、x86...)的target,是否就需要N*M个编译器?三段式架构的价值就提现出来了,通过共享优化器的中转,很好的解决了这个问题。
Clang和LLVM关系:
Clang是一个C++编写、基于LLVM、发布于LLVM BSD许可证下的C/C++/Objective-C/Objective-C++编译器。那么为什么已经有了GCC还要开发Clang呢?Clang相比于GCC有什么优势呢? 其实,这也是Clang当初在设计开发的时候所主要考虑的原因。Clang是一个高度模块化开发的轻量级编译器,它的编译速度快、占用内存小、非常方便进行二次开发。
LVM和Clang的关系是怎样的呢。我们将它们对应于传统的编译器当中的几个独立的部分,这样能够更加方便明确生动的表述。
其实,对应到这个图中,我们就可以非常明确的找出它们的对应关系。LLVM与Clang是C/C++编译器套件。对于整个LLVM的框架来说,包含了Clang,因为Clang是LLVM的框架的一部分,是它的一个C/C++的前端。Clang使用了LLVM中的一些功能,目前知道的就是针对中间格式代码的优化,或许还有一部分生成代码的功能。从源代码角度来讲,clang是基于LLVM的一个工具。而功能的角度来说,LLVM可以认为是一个编译器的后端,而clang是一个编译器的前端,他们的关系更加的明了,一个编译器前端想要程序最终变成可执行文件,是缺少不了对编译器后端的介绍的。
LLVM编译工具链编译流程:
使用LLVM的对一门语言编译的简图如下所示:
LLVM编译一个源文件的过程:预处理 -> 词法分析 -> Token -> 语法分析 -> AST -> 代码生成 -> LLVM IR -> 优化 -> 生成汇编代码 -> Link -> 目标文件
完全需要我们手工,或者依靠其他工具如lex, yacc来做的事情,是从源代码到token的词法分析和从token到AST的语法分析;词法分析的输出是将源代码解析成一个个的token。这些token就是有类型和值的一些小单元,比如是关键字,还是数字,还是标识符,从AST转LLVM开始,LLVM就开始提供一系列的工具帮助我们快速开发。从IR(中间指令代码)到DAG(有向无环图)再到机器指令,针对常用的平台,LLVM有完善的后端。也就是说,我们只要完成了到IR这一步,后面的工作我们就享有和Clang一样的先进生产力了。
CodeGen负责将语法树从顶至下遍历,翻译成LLVM IR,LLVM IR是Frontend的输出,也是LLVM Backerend的输入,桥接前后端。
LLVM命令:
- 可以使用 llc 将 LLVM 字节代码转换成特定于平台的汇编代码
- lli 可以通过解释器或使用高级选项中的即时 (JIT) 编译器执行此工作
- llvm-gcc 是 GNU Compiler Collection (gcc) 的修改版本,可以在使用 -S -emit-llvm 选项运行时会生成 LLVM 字节代码。
- 编译指令:
clang -c -emit-llvm test1.c -o test1.bc 编译产生字节码
clang -S -emit-llvm test.c -o test.ll 编译产生可视化字节码
llvm-dis test1.bc test1.ll bc字节码转为可视化字节码ll
llvm-as test1.ll test1.bc 可视化字节码转为字节码bc
Libatk-1.0-0.dll - dll file called "atk" is a part of atk program developed by Sun Microsystems Inc..(Libatk-1.0-0.dll - dll 文件称为"atk"是太阳微系统公司开发的atk 程序的一部分。)