CMake + cpp + WSL 学习记录

这篇内容记录了有关cmake配置问题的解决方案。

问题1. 安装好 Ubuntu 之后马上就报错:0x800701bc

安装 ubuntu 执行的代码如下:

1
wsl --install -d ubuntu 20.04

这个时候首先检查启用或关闭 Windows 功能里面是否已经打开了:

  1. 适用于 Linux 的 Windows 子系统
  2. 虚拟机平台

这两个安装好之后需要重启电脑生效。然后点击下面这个链接:Linux Update Setup 并点击安装。安装好之后就没问题了。

问题2. 安装 Eigen 库始终失败:找不到 EigenConfig.cmake

这个问题主要是因为下载得到的 Eigen 库代码是源码,是需要经过编译的。

在下载好的 Eigen 库源码文件夹下执行以下代码:

1
2
3
4
sudo mkdir build
cd build
sudo cmake ..
(sudo make install)

最后一行打了括号,因为我目前使用的是 win11 的平台,没有make这个函数指令。但是在ubuntu上应该是需要这个的。

问题3. 使用清华源

这里因为清华源有开发目前 WSL 常用的所有版本对应的源链接,所以留一下这个网址备忘。

ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

问题4. 安装必要的库,安装OpenCV

首先是最基本构建工程需要的一些库:

1
2
3
4
5
sudo apt install -y g++ 
sudo apt install -y cmake
sudo apt install -y make
sudo apt install -y wget
sudo apt install -y unzip

然后是opencv依赖的必需品:

1
sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev

OpenCV 官网链接点击 Github 链接进行包内容的下载。直接下载在~/的地方就可以了。

问题5:CMake安装OpenCV时卡在 IPPICV

在下面这个链接里下载这个文件:

链接: https://pan.baidu.com/s/1C05qBz-eSAUIxdwljce0kw 密码: 4q33

上面这个方式试了一下感觉不是很有用。于是反复执行原来的 make 函数,成功编译好了。

1
cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=YES ..

Note: 记录 ssh 基本操作

1
2
3
4
git config --global user.name ""
git config --global user.email ""
ssh-keygen -t rsa -C ""
vim ...(id_rsa.pub)

问题6:clone 仓库的时候报错

报错具体内容:remote: Support for password authentication was removed

改用 git-ssh 而非 HTTPS 进行 clone 就好了。

update: 有的仓库没有 git-ssh,第二种解决办法是开一下梯子。

问题7:在对应目录下使用code .命令不生效

在 ubuntu 的终端中使用如下命令:

1
vim ~/.bashrc

然后找到原本电脑上安装好的 VS Code 的目录下的 /bin目录,在我的电脑上就是D:\Program Files (x86)\Microsoft VS Code\bin,切换成/mnt/d/...的语法,在.bashrc中添加这一行:

1
export PATH="$PATH:/mnt/e/program/VSCode/Microsoft VS Code/bin"

重启 ubuntu 终端并重新执行原命令即可。

问题8:安装 yaml-cpp

1
2
3
4
5
6
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build && cd build
cmake -D BUILD_SHARED_LIBS=ON ..
make -j16
sudo make install

python 中的 yaml 包

需要安装的是:conda install pyyaml

问题9:找不到 “omp.h”

OpenMP库是随着cpp一起安装的,不需要额外安装其他东西。但实际上还是有依赖的库是一定要安装好的,否则还是无法使用这个库。

1
sudo apt install -y libomp-dev

问题10:VSCode 配置 Clangd

可以跟着为vscode配置Clangd CSDN博客 这篇文章做。其中涉及到的代码在这里也可以复制,就不用再去登录 CSDN。

settings.json

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
{
"files.associations": {
"iostream": "cpp",
"intrinsics.h": "c",
"ostream": "cpp",
"vector": "cpp"
},
// 开启粘贴保存自动格式化
"editor.formatOnPaste": true,
"editor.formatOnSave": true,
"editor.formatOnType": true,
"C_Cpp.errorSquiggles": "Disabled",
"C_Cpp.intelliSenseEngineFallback": "Disabled",
"C_Cpp.intelliSenseEngine": "Disabled",
"C_Cpp.autocomplete": "Disabled", // So you don't get autocomplete from both extensions.
"clangd.path": "/usr/bin/clangd",
// Clangd 运行参数(在终端/命令行输入 clangd --help-list-hidden 可查看更多)
"clangd.arguments": [
// 让 Clangd 生成更详细的日志
"--log=verbose",
// 输出的 JSON 文件更美观
"--pretty",
// 全局补全(输入时弹出的建议将会提供 CMakeLists.txt 里配置的所有文件中可能的符号,会自动补充头文件)
"--all-scopes-completion",
// 建议风格:打包(重载函数只会给出一个建议)
// 相反可以设置为detailed
"--completion-style=bundled",
// 跨文件重命名变量
"--cross-file-rename",
// 允许补充头文件
"--header-insertion=iwyu",
// 输入建议中,已包含头文件的项与还未包含头文件的项会以圆点加以区分
"--header-insertion-decorators",
// 在后台自动分析文件(基于 complie_commands,我们用CMake生成)
"--background-index",
// 启用 Clang-Tidy 以提供「静态检查」
"--clang-tidy",
// Clang-Tidy 静态检查的参数,指出按照哪些规则进行静态检查,详情见「与按照官方文档配置好的 VSCode 相比拥有的优势」
// 参数后部分的*表示通配符
// 在参数前加入-,如-modernize-use-trailing-return-type,将会禁用某一规则
"--clang-tidy-checks=cppcoreguidelines-*,performance-*,bugprone-*,portability-*,modernize-*,google-*",
// 默认格式化风格: 谷歌开源项目代码指南
// "--fallback-style=file",
// 同时开启的任务数量
"-j=2",
// pch优化的位置(memory 或 disk,选择memory会增加内存开销,但会提升性能) 推荐在板子上使用disk
"--pch-storage=disk",
// 启用这项时,补全函数时,将会给参数提供占位符,键入后按 Tab 可以切换到下一占位符,乃至函数末
// 我选择禁用
"--function-arg-placeholders=false",
// compelie_commands.json 文件的目录位置(相对于工作区,由于 CMake 生成的该文件默认在 build 文件夹中,故设置为 build)
"--compile-commands-dir=build"
],
}

问题11:VSCode 配置 gdb 调试

我的配置文件launch.json

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
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/bin/bSSFPSeq",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"logging": {
"traceResponse": true
},
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
},
{
"name": "(lldb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/${fileBasenameNoExtension}", // 只有这一行是自己编辑过的,其他的全是默认,方便吧?
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "lldb",
"miDebuggerPath": "/usr/bin/gdb.exe",
"preLaunchTask": "C/C++: g++-11 生成活动文件"
// "setupCommands": [
// {
// "description": "Enable pretty-printing for gdb",
// "text": "-enable-pretty-printing",
// "ignoreFailures": true
// },
// {
// "description": "Set Disassembly Flavor to Intel",
// "text": "-gdb-set disassembly-flavor intel",
// "ignoreFailures": true
// }
// ]
}
]
}

请记住,在使用之前确保已经安装好了gdb。Ubuntu 的确是自带一个 gdb 调试工具,但那个几乎没用,因为缺乏必要的包工具。

1
sudo apt-get install gdb

问题11:Linux 安装 Miniconda

我使用 python 来生成序列结点文件,为此我还是需要安装一个miniconda的。

下载:
1
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py38_4.8.3-Linux-x86_64.sh --no-check-certificate
安装:
1
bash Miniconda3-py38_4.8.3-Linux-x86_64.sh
修改~/.bashrc:

vim 打开,在这个文件的最后加入一行:

1
export PATH=$PATH:/home/用户名/anaconda3/bin

保存退出,激活:

1
source ~/.bashrc

这个时候使用conda命令才能看到确实已经激活。

但是即便如此,每次打开新的window的时候都需要使用上面这行代码,否则的话conda命令就还是无效的。所以按照下面进行修改:

~/.bash_profile文件中添加如下代码:

1
2
3
if test -f .bashrc ; then
source .bashrc
fi

重启后就发现确实生效了。不用再麻烦了。

换源:

在用户目录(~)下:

1
touch .condarc

vim打开,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
channels:
- defaults
show_channel_urls: true
channel_alias: https://mirrors.tuna.tsinghua.edu.cn/anaconda
default_channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:
conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

清除缓存:

1
conda clean -i

检查是否换源成功:

1
conda config --show

问题12:Win11 安装 Miniconda

Miniconda — conda documentation 选择合适的版本,一路下一步,直到安装完毕。

1
2
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes

使用这个命令光速换源。

创建虚拟环境

因为我这边是直接安装在了C盘,接下来就需要在指定的工作区安装虚拟环境。一些常用的指令:

1
2
3
4
// 更新
conda update conda
// 查看现有的虚拟环境
conda info --envs

创建:

1
conda create --prefix=D:/Study/venv -n venv python=3.8

删除的话似乎直接将虚拟环境所在的那个文件夹丢入垃圾桶就可以了。conda列表将自动把那个环境扔掉。

但感觉似乎也没有必要在win的环境下再安装虚拟环境。

问题13:.gitignore文件忽略不生效

原本是想将build文件夹下的文件都忽略掉,但是使用了build/*并没有任何作用。

原因:build文件夹下的文件已经在本地缓存中被添加进入了结点,已经无法被忽略了。这个时候需要执行下面的代码,删除缓存:

1
git rm -r --cached .

然后按照原本的上传规则进行上传就好了。