manjaro + kde 使用过程中问题记录及解决方法
前言:使用manjaro的经历:2020/11月中旬时,我被自己很差的电脑搞得心态爆炸,开机要5分钟,只是开个pycharm编辑器+网页电脑就开始卡屏,于是就决定购买新电脑。在新电脑还没到货的情况下,想给旧电脑做做好玩的事情,刚好今年我们上linux实验课,同时有了解到manjaro这个linux发行版,所以我给自己的旧电脑安装了manjaro+kde;这次操作系统更换着实给了我惊喜,原来使用win10那么卡慢的电脑,在这个新操作系统下有明显的流畅提升,至少同时开6个应用程序也比原来开2个要快,并且kde这个精美可定制的桌面环境我也很喜欢。于是我入坑了manjaro,希望自己在使用这个操作系统的过程中同时学好linux。
但是,我还是个linux菜鸟,在使用过程中会遇到各种各样的问题。于是我决定把这些问题和解决方法记录下来,一来方便我将来再出现同样的问题可以快速查看,二来帮助同样在使用manjaro的人们。
vscode中C++多文件编译
问题:在vscode中,在默认情况下,按F5后只能编译当前文件,无法编译多个文件。
解决:举个例子
在~/code/C++/learn中新建的一下3个文件
//main.cpp
#include "a.h"
#include <iostream>
int main(){
func();
std::cout << 'a' << std::endl;
return 0;
}
//a.cpp
#include <iostream>
#include "a.h"
void func(){
std::cout << "Hello World!" << std::endl;
}
//a.h
#ifndef _A_H_
#define _A_H_
extern void func();
#endif
如果我们在某一个文件按F5就会出错,那该怎么办了,我们需要编写Makefile文件,launch.json文件,task.json文件。
Makefile
src = main.cpp a.cpp
learn: $(src) a.h
g++ -g $(src) -o learn
clean:
rm learn
tasks.json
{
"tasks": [
{
"type": "shell",
"label": "make build active file",
"command": "/usr/bin/make",
"args": [
"-C",
"${workspaceFolder}"
]
}
],
"version": "2.0.0"
}
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "g++ - 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/${workspaceRootFolderName}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "make build active file",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
json文件放入~/code/C++/learn/.vscode中
这时候你在点击F5就会进入调试。
ok,这就完成了吗,当然不是,上面的json文件是通用的,但是Makefile不是,不同的项目编写的内容不同,并且对于复杂的项目,Makefile的编写很麻烦,甚至你可能写不出来;众所周知,人是懒惰的, 有人就发明了qmake来自动生产Makefile。
下面来介绍qmake的使用:
qmake安装 (qmake是Qt自带的)
先进入程序目录:
然后输入
你会发现生成了 文件夹名.pro 文件
最后输入
你会发现生成了 Makefile文件
然后和上面介绍的操作即可(就是写好两个json文件)
vscode中Qt的配置
问题:如何在vs中使用Qt呢?
解决:
首先安装好Qt
查看自己qt库在哪里,一般在/usr/include/qt中
在~/code/C++/test中创建3个文件
main.cpp
#include <QApplication>
#include "dialog.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog dialog;
dialog.show();
return a.exec();
}
dialog.h
#ifndef _MAIN_DIALOG_
#define _MAIN_DIALOG_
#include <QDialog>
#include <QLabel>
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = 0);
~Dialog();
private:
QLabel *label_test;
};
#endif
dialog.cpp
#include <QtWidgets>
#include "dialog.h"
Dialog::Dialog(QWidget *parent) : QDialog(parent)
{
this->setWindowTitle("hello");
label_test = new QLabel(this);
label_test->setText("HelloWorld");
QGridLayout *main_layout = new QGridLayout(this);
main_layout->addWidget(label_test, 0, 0);
}
Dialog::~Dialog()
{
}
编写c_cpp_properties.json, launch.json, task.json文件,后两个文件和前面内容一致。
c_cpp_properties.json
{
"configurations": [
{
"name": "gcc-64",
"intelliSenseMode": "gcc-x64",
"includePath": [
"/usr/include/qt",
"/usr/include/qt/QtCore",
"/usr/include/qt/QtGui",
"/usr/include/qt/QtWidgets",
"${workspaceRoot}"
],
"browse":{
"path":[
"/usr/include/qt",
"/usr/include/qt/QtCore",
"/usr/include/qt/QtGui",
"/usr/include/qt/QtWidgets",
"${workspaceRoot}"
]
},
"compilerPath": "/usr/bin/g++",
"cStandard": "c11",
"cppStandard": "c++17"
}
],
"version": 4
}
其中"includePath"和"path”内容一致,为qt库所在位置。
编写完成后目录内容为:
然后输入qmake -project
你会发现生成了test.pro文件,我们要修改这个文件,在第一行添加
QT += gui core widgets
然后输入qmake
你会发现生成了Makefile文件
最后在vscode按F5就可以运行。
linux中程序的打包发布(这里以打包QT程序为例)
首先,运行程序得到了parse这个可执行程序,将这个程序xxx放置与新文件夹~/qwer中;
接着向~/qwer文件夹中添加pack.sh和parse.sh这两个脚本,脚本内容具体如下:
pack.sh
#!/bin/sh
exe="parse" #你需要发布的程序名称
des="/home/shuojia/qwer" #创建文件夹的位置
deplist=$(ldd $exe | awk '{if (match($3,"/")){ printf("%s "),$3 } }')
cp $deplist $des
其中注意exe=“parse”,等号右边具体的内容由你的执行文件名字决定。
parse.sh
#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"
该文件的命名也由可执行文件决定,即 可执行文件名.sh
然后执行pack.sh脚本,他就会把运行该程序所需要的所有依赖放入~/qwer文件夹中。
最后你就可以把这个文件夹打包发送给其他人来运行了
root权限的获取和退出
获取root权限
(1)输入命令su
(2)在输入正确的密码
退出root权限
输入命令exit
pip安装时速度过慢问题
pip安装库文件时,默认使用国外的源,由于国内原因,速度当然不快,
好在国内提供了各种镜像。
(1)阿里云http://mirrors.aliyun.com/pypi/simple/
(2)豆瓣http://pypi.douban.com/simple/
(3)清华大学https://pypi.tuna.tsinghua.edu.cn/simple/
(4)中国科学技术大学http://pypi.mirrors.ustc.edu.cn/simple/
(5)华中科技大学http://pypi.hustunique.com/
下面用一个例子展示对国内源的使用
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ jieba
移动文件
移动多个文件
mv [-fiu] source destination
-f: force强制新移动,会覆盖同名文件
-i: 遇到同名文件会询问
-u: 遇到同名文件会查看新旧,若源文件更新,则更新
例子:
移动/usr/file文件到/bin中并以file2命名
mv -f /usr/file /bin/file2
移动/usr/file文件到/bin目录下
mv -f /usr/file /bin
同时移动多个文件到制定目录下
mv source1, source2,... director
例子:
mv file1, file2, file3 /usr
杀死进程
问题:linux的wps有个bug,在复制公式的时候wps会卡住,无法通过图像操作关掉
解决:
(1)输入top
命令在查看当前正在运行的进程
这里我们注意进程号和commad(执行程序的名称)这两个部分,比如进程号8084对应的commad为net-ease-cloud-m(网易云音乐)
(2)下面通过输入kill -9 进程号
就可以杀死该进程,例如,我想关系网易云音乐,就输入kill -9 8084
即可
python版本切换
问题:manjaro的包管理只能维护python2和python3各一个版本(一般为最新),但是如果我想要在不同python3版本切换(比如pyhon3.8.6和python3.5.6之间),就没办法实现。
解决:使用pyenv工具
安装步骤
- 下载(有两种下载方法)
git clone https://github.com/pyenv/pyenv ~/.pyenv
sudo pacman -S pyenv
推荐使用第二种
- 环境配置
分别输入以下命令
echo 'export PATH=~/.pyenv/bin:$PATH' >> ~/.bashrc
echo 'export PYENV_ROOT=~/.pyenv' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc
需要注意的是,如果你不是使用bash作为默认shell,.bashrc
需要替换。比如我使用zsh,所以需要替换为.zshrc
- 激活
输入下面的命令source ~/.bashrc
,同理,.bashrc
也需要根据的默认shell来替换 - 安装python
输入命令pyenv install --list
来查看可以安装的python版本
输入命令pyenv install 版本号
就可以安装python,如pyenv install 3.6.4
- 卸载python
输入命令pyenv uninstall 版本号
即可 - 选择python版本
在某一个目录下输入命令pyenv local 版本号
,就可以指定当前目录下的python版本,如果你想使用系统自带的版本的话,可以输入pyenv local system
使用总结
一般情况下使用设置pyenv local system
使用系统自带的python版本(最新版),如果有特殊情况需要使用其他版本,就pyenv install 需要的版本号
,再pyenv local 需要的版本号