前言:使用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 需要的版本號