Tools

WSL #

cmd #

wsl -l -v
wsl --shutdown	#关闭
wsl --list --verbose # 查看已安装的发行版、WSL 版本信息和当前状态
wsl --set-default <DistroName> # 重新指定默认发行版
wsl --export Ubuntu-22.04 e:\Ubuntu-22.04.tar#导出
wsl --unregister Ubuntu-22.04 #注销并卸载
wsl --import Ubuntu-22.04 E:\ubuntu2204 E:\Ubuntu-22.04.tar#导入
wsl --set-default <DistroName> # 重新指定默认发行版

环境配置 #

  • windows 设置打开: 适用于 Linux 的 Windows 子系统虚拟机平台

image-20240915093843416

image-20240915093856560

  • Linux 内核更新包:https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

  • wsl --list --verbose # 查看已安装的发行版、WSL 版本信息和当前状态
    wsl --set-default <DistroName> # 重新指定默认发行版
    

Windows 11:WSL 2 安装和管理指南,3 种方法任你选 - 系统极客 (sysgeek.cn)

Win11 安装 Docker Desktop 和 WSL2 并进行安装位置迁移_windows 11 wsl 修改安装位置-CSDN 博客

常见问题 #

VmmemWSL 占用 CPU 或内存资源过高 #

Vmmem 进程(WSL)占用 CPU 或内存资源过高的解决办法-CSDN 博客

代理问题 #

WSL2 如何解决 clash 代理问题 - VariantConst

C/C++ #

sudo apt install build-essential
sudo apt -y install gcc g++ gdb

conda #

基本命令 #

conda create --name myenv python=3.8
conda activate myenv
conda deactivate
conda list	#命令来查看当前环境中安装的包。
conda env remove --name myenv	#删除
conda info --envs	#查找所有虚拟环
conda install [package-name]        # 安装名为[package-name]的包
conda install [package-name]=X.X    # 安装名为[package-name]的包并指定版本X.X
conda update [package-name]         # 更新名为[package-name]的包
conda remove [package-name]         # 删除名为[package-name]的包
conda list                          # 列出当前环境下已安装的所有包
conda search [package-name]         # 列出名为[package-name]的包在conda源中的所有可用版本
conda create --name [env-name]      # 建立名为[env-name]的Conda虚拟环境
conda activate [env-name]           # 进入名为[env-name]的Conda虚拟环境
conda deactivate                    # 退出当前的Conda虚拟环境
conda env remove --name [env-name]  # 删除名为[env-name]的Conda虚拟环境
conda env list                      # 列出所有Conda虚拟环境

环境配置 #

wget https://repo.anaconda.com/miniconda/Miniconda3-py38_23.5.2-0-Linux-x86_64.sh
bash Miniconda3-py38_23.5.2-0-Linux-x86_64.sh

安装以后要重启才能生效!

常见问题 #

  • 安装以后要重启才能生效!

  • pycharm 无法添加 conda 环境时无法找到对应环境的 python.exe 文件 image-20240905112153852

Conda Executable 是 conda 的执行文件,不是填环境的 python 解释器 0.0

看错两次了

cuda 驱动,cuda-toolkit, cudnn #

环境配置 #

Windows 11/10 WSL2 Ubuntu 20.04 下配置 Cuda 及 Pytorch_win11 的 cuda 和 ubuntu 对比-CSDN 博客

安装 WSL Cuda 驱动 #

cudatoolkit #

CUDA Toolkit 12.6 Update 1 Downloads | NVIDIA Developer

image-20240910154615669

cudnn #

cuDNN Archive | NVIDIA Developer

重装 #

CUDA 的正确安装/升级/重装/使用方式 - 知乎 (zhihu.com)

pytorch, dgl, PyG #

PyTorch

Deep Graph Library (dgl.ai)

PyG

conda install pytorch torchvision torchaudio pytorch-cuda=12.4 -c pytorch -c nvidia
conda install -c dglteam/label/th24_cu124 dgl
conda install pyg -c pyg
#test
python -c "import torch; print(torch.cuda.is_available())"
python -c "import torch; print(torch.version.cuda)"

docker #

使用 dockerfile #

dockerfile #

Dockerfile 是一个文本文件,包含一系列指令来组装 [Docker 镜像]( https://so.csdn.net/so/search?q=Docker 镜像&spm=1001.2101.3001.7020)。每个指令执行一个特定动作,例如安装包、复制文件或定义启动命令。

image-20241116203451094

docker pull ubuntu:20.04 #下一个镜像
docker run --rm ubuntu:22.04 nproc#安装,并查看cpu核心数
docker run -it ubuntu:22.04 bash #进入交互模式,这种情况在能用、
docker run -it --name my_centos7 -v /path/on/host:/path/in/container centos:7#如果需要将数据保存到宿主机上,可以挂载一个目录, 同时指定名字, 注意exit退出容器后容器还会存在,使用docker ps -a 才能看到
docker start <container_name> #重新启动暂停的容器
docker exec -it <container_name> bash #重新进入容器

apt install, 注意update
docker ps #查看运行的容器
docker ps -a#查看运行的容器,包括暂停的
#docker下 的gui显示也可以安装通过设置DISPLAY环境变量来处理
docker commit <容器ID或名称> <镜像名称>:<标签> #保存容器为镜像
docker images #查看保存的镜像
docker rm <container_name>#删除容器
docker rmi -f <镜像ID或名称> #删除镜像
docker exec -it my_container bash #对同一个docker容器开启多个终端
docker run -v <主机目录>:<镜像目录> -it <镜像名称>:<标签> bash #挂载

container 内的C++项目debug #

linux下vscode支持的调试器为gdb

  1. 安装vs code 插件: Dev Container

  2. 安装gdb:apt-get install build-essential gdb

  3. 运行:Attach to Running Container

    image-20241125165934766

  4. 在vscode中打开工程目录,并添加launch文件

  5. 用g++或者用task.json生成binary可执行文件,注意编译的时候加上-g,-g意思就是编译出带调试信息的可执行文件,如果少了这个-g,生成的可执行文件就不能够调试了

  6. 然后点三角形就行。

参考 #

centos 容器无法联网问题 #

Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=container error was 14: curl#6 - “Could not resolve host: mirrorlist.centos.org; Unknown error”

#还是不行。。。

修改vscode docker容器内终端没有颜色 #

image-20241130203639869

自定义优化VsCode终端样式(提示高亮)_vscode终端颜色设置-CSDN博客

install #

Ubuntu 安装 Docker_ubuntu 重新安装 docker-CSDN 博客

Cmake #

basic #

基本内置宏变量 #

  • PROJECT_SOURCE_DIR 使用cmake命令后紧跟的目录,一般是工程的根目录
  • PROJECT_BINARY_DIR 执行cmake命令的目录
  • CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径
  • CMAKE_CURRENT_BINARY_DIR target 编译目录
  • EXECUTABLE_OUTPUT_PATH 重新定义目标二进制可执行文件的存放位置
  • LIBRARY_OUTPUT_PATH 重新定义目标链接库文件的存放位置
  • PROJECT_NAME 返回通过PROJECT指令定义的项目名称
  • CMAKE_BINARY_DIR 项目实际构建路径,假设在build目录进行的构建,那么得到的就是这个目录的路径

常用文件结构 #

  • inc目录下存放头文件
  • src目录下存放源文件
  • lib目录下存放生成的库
  • bin目录下存放可执行文件
  • build目录下存放构建项目相关的文件

command #

include_directories(headpath)

add_executable(app ${SRC_LIST})

案例 #

.
|-- CMakeLists.txt
|-- bin
|   `-- binary
|-- build
|   |-- CMakeCache.txt
|   |-- CMakeFiles
|   |   |-- 3.27.0
|   |   |-- CMakeConfigureLog.yaml
|   |   |-- CMakeDirectoryInformation.cmake
|   |   |-- CMakeScratch
|   |   |-- Makefile.cmake
|   |   |-- Makefile2
|   |   |-- TargetDirectories.txt
|   |   |-- binary.dir
|   |   |-- cmake.check_cache
|   |   |-- pkgRedirects
|   |   |-- progress.marks
|   |   `-- src_dyn_lib_so.dir
|   |-- Makefile
|   `-- cmake_install.cmake
|-- lib
|   |-- libsrc_dyn_lib_so.so
|   `-- libsrc_sta_lib_a.a
`-- src
    |-- db
    |   |-- func.cpp
    |   `-- func.h
    |-- main.cpp
    |-- network
    |-- test
    `-- utils
message("run cmake...")

# 设置二进制文件的名称
set(BINARY_NAME "binary")
set(PROJECT_DIR "/root/cmake_test")
set(BIN_DIR "${PROJECT_DIR}/bin")
set(SRC_DIR "${PROJECT_DIR}/src")
set(LIB_DIR "${PROJECT_DIR}/lib")


# set(LIBRARY_OUTPUT_DIRECTORY ${LIB_DIR})           # 动态库(.so) 输出路径
# set(ARCHIVE_OUTPUT_DIRECTORY ${LIB_DIR})           # 静态库(.a) 输出路径
set(EXECUTABLE_OUTPUT_PATH ${BIN_DIR})              #设置可执行文件位置




# 设置CMake的最低版本
cmake_minimum_required(VERSION 3.10)

# 项目名称
project(MyProject)

# 设置C++标准
set(CMAKE_CXX_STANDARD 11)

# 获取所有子目录下的源文件
file(GLOB_RECURSE SOURCES 
    "${SRC_DIR}/db/*.cpp" 
    "${SRC_DIR}/network/*.cpp" 
    "${SRC_DIR}/utils/*.cpp" 
)

# 获取所有头文件
file(GLOB_RECURSE HEADERS 
    "${SRC_DIR}/db/*.h" 
    "${SRC_DIR}/network/*.h" 
    "${SRC_DIR}/utils/*.h"
)


#静态库和动态库
# add_library(src_sta_lib_a STATIC ${SOURCES})
add_library(src_dyn_lib_so SHARED ${SOURCES})
# set_target_properties(src_sta_lib_a PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${LIB_DIR})# 静态库(.a) 输出路径
set_target_properties(src_dyn_lib_so PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${LIB_DIR})# 动态库(.so) 输出路径
# link_directories(${LIB_DIR})# 通过命令指定出要链接的动态库的位置,指定静态库位置使用的也是这个命令 #如果该静态库不是系统提供的(自己制作或者使用第三方提供的静态库)可能出现静态库找不到的情况,此时可以将静态库的路径也指定出来
# link_libraries(src_sta_lib_a)# 链接静态库 #用于设置全局链接库,这些库会链接到之后定义的所有目标上 #可以是全名 libxxx.a #也可以是掐头(lib)去尾(.a)之后的名字 xxx

# 创建可执行文件
add_executable(${BINARY_NAME} ${SRC_DIR}/main.cpp ${SOURCES})

#链接动态库
target_link_libraries(${BINARY_NAME} src_dyn_lib_so)#用于指定一个目标(如可执行文件或库)在编译时需要链接哪些库#支持指定库的名称、路径以及链接库的顺序。#动态库的链接具有传递性




# 设置头文件目录
# 必须放到add_executable后面 add
# 指定包含目录,以便编译器在编译源文件时能够找到所需的头文件
target_include_directories(${BINARY_NAME} PRIVATE 
    ${SRC_DIR}/db
    ${SRC_DIR}/network
    ${SRC_DIR}/utils
)

set(CMAKE_BUILD_TYPE "Debug")
# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3 -march=native")

message("cmake done...")

动态库和静态库 #

有些时候我们编写的源代码并不需要将他们编译生成可执行程序,而是生成一些静态库或动态库提供给第三方使用,下面来讲解在cmake中生成这两类库文件的方法。

静态库 #

.a

静态库会在生成可执行程序的链接阶段被打包到可执行程序中,所以可执行程序启动,静态库就被加载到内存中了。cmake中指定要链接的动态库的时候,应该将命令写到生成了可执行文件之后

add_library(库名称 STATIC 源文件1 [源文件2] ...)

add_library(calc STATIC ${SRC_LIST})

这样最终就会生成对应的静态库文件libcalc.a。

动态库 #

.so

动态库在生成可执行程序的链接阶段不会被打包到可执行程序中,当可执行程序被启动并且调用了动态库中的函数的时候,动态库才会被加载到内存

add_library(calc SHARED ${SRC_LIST})

这样最终就会生成对应的动态库文件libcalc.so。

动态库的链接具有传递性,如果动态库 A 链接了动态库B、C,动态库D链接了动态库A,此时动态库D相当于也链接了动态库B、C,并可以使用动态库B、C中定义的方法

add_library(库名称 SHARED 源文件1 [源文件2] ...)

target_link_libraries(A B C) target_link_libraries(D A)

场景 #

debug宏定义 #

#include <stdio.h>
#define NUMBER  3

int main()
{
    int a = 10;
#ifdef DEBUG
    printf("我是一个程序猿, 我不会爬树...\n");
#endif
    for(int i=0; i<NUMBER; ++i)
    {
        printf("hello, GCC!!!\n");
    }
    return 0;
}

在测试的时候去把它定义出来,其中一种方式就是在gcc/g++命令中去指定,如下: gcc test.c -DDEBUG -o app 在gcc/g++命令中通过参数 -D指定出要定义的宏的名字,这样就相当于在代码中定义了一个宏,其名字为DEBUG。

在CMake中我们也可以做类似的事情,对应的命令叫做add_definitions

add_definitions(-D宏名称)

vscode C++ cmake debug #

目录结构

.
|-- LICENSE
|-- README.md
|-- build
|   |-- CMakeCache.txt
|   |-- CMakeFiles
|   |-- Makefile
|   |-- POST9.dat
|   |-- POWV9.dat
|   |-- cmake_install.cmake
|   |-- compile_commands.json
|   |-- debug.guide
|   `-- iccad19gr
|-- data
|-- drcu
|-- ispd18eval
|   |-- README
|   |-- ispd18eval.sh
|   |-- ispd18eval.tcl
|   |-- ispd18eval.w
|   `-- ispd18eval_bin
|-- ispd19eval
|   |-- README
|   |-- ispd19eval.sh
|   |-- ispd19eval.tcl
|   |-- ispd19eval.w
|   `-- ispd19eval_bin
|-- lib
|-- mybenchmarks
|   |-- aes_cipher_top
|   |-- ispd18_test1
|   `-- ispd19_test3
|-- myoutput
|   |-- flow.log
|   `-- ispd18_test1
|-- rsyn
|   |-- LICENSE
|   |-- README.md
|   |-- include
|   |-- lib
|   `-- src
|-- run
|   |-- POST9.dat
|   |-- POWV9.dat
|   |-- __pycache__
|   |-- build.py
|   |-- debug.sh
|   |-- drcu
|   |-- flow.py
|   |-- gprof2dot.py
|   |-- iccad19gr
|   |-- ispd18eval
|   |-- ispd19eval
|   |-- lefRWarning.log
|   |-- rebuilt.sh
|   |-- run.py
|   `-- run_base.py
|-- scripts
|   |-- build.py
|   |-- gprof2dot.py
|   |-- run.py
|   `-- run_base.py
|-- src
|   |-- CMakeLists.txt
|   |-- db
|   |-- flute
|   |-- global.h
|   |-- gr_db
|   |-- main.cpp
|   |-- multi_net
|   |-- single_net
|   `-- utils
`-- test.sh
#########
# Setup #
#########

# Specify the minimum version for CMake
cmake_minimum_required(VERSION 2.8)

# Message
message(STATUS "ICCAD19 GR CUHK")
message(STATUS ${CMAKE_CURRENT_SOURCE_DIR})
message(STATUS ${PROJECT_SOURCE_DIR})

# Find includes in the build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Project's name
project(iccad19gr)

# Set the output folder where your program will be created
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})

set(CMAKE_CXX_STANDARD 14)

set(PATH_RSYN ${CMAKE_CURRENT_SOURCE_DIR}/../rsyn)
set(PATH_ICCAD19 ${CMAKE_CURRENT_SOURCE_DIR})

###################
# Warnings/Errors #
###################

set(CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -Werror=return-type")

######################
# Check Dependencies #
######################
# uncommment this line if you are using self-compiled boost lib
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost COMPONENTS system filesystem program_options REQUIRED)
# find_package(Threads)

###############
# Source Code #
###############
file(GLOB_RECURSE SRC_FILES_RSYN
    ${PATH_RSYN}/src/*.cpp
    ${PATH_RSYN}/src/*.cc
    ${PATH_RSYN}/src/*.c)

file(GLOB_RECURSE SRC_FILES_ICCAD19
    ${PATH_ICCAD19}/*.cpp
    ${PATH_ICCAD19}/*.c)

set(SRC_FILES ${SRC_FILES_RSYN} ${SRC_FILES_ICCAD19})

#################
# Library Paths #
#################
# Need to come before target is created.

if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
link_directories(${PATH_RSYN}/lib/linux)
endif()

if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
link_directories(${PATH_RSYN}/lib/macosx)
endif()

###########
# Targets #
###########

add_executable(iccad19gr ${SRC_FILES})

#######################
# Include Directories #
#######################

include_directories(${PATH_RSYN}/src)
include_directories(${PATH_RSYN}/src/rsyn/export)
include_directories(${PATH_RSYN}/include)
include_directories(${PATH_ICCAD19})

#################
# Linker Flags  #
#################

# TODO: set static under release mode only
set_target_properties(iccad19gr PROPERTIES LINK_FLAGS "-static -Wl,--whole-archive -rdynamic -lpthread -Wl,--no-whole-archive")

# LEF/DEF
target_link_libraries(iccad19gr lef)
target_link_libraries(iccad19gr def)

# Boost
target_include_directories(iccad19gr PUBLIC ${Boost_INCLUDE_DIR})
target_link_libraries(iccad19gr ${Boost_LIBRARIES})

#进行debug编译

cmake src/ -B build -DCMAKE_BUILD_TYPE=Debug

测试指令:

cp run/PO* build/.
cd build
./iccad19gr -lef ../mybenchmarks/ispd18_test1/ispd18_test1.input.lef -def ../mybenchmarks/ispd18_test1/ispd18_test1.input.def -output debug.guide --thread 8

c_cpp_properties.json

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "/root/cu-gr/src/"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c17",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "linux-gcc-x64",
            "configurationProvider": "ms-vscode.cmake-tools"
        }
    ],
    "version": 4
}

launch.json

{
    "configurations": [
    {
        "name": "(gdb) Launch",
        "type": "cppdbg",
        "request": "launch",
        "program": "/root/cu-gr/build/iccad19gr",
        "args": [],
        "stopAtEntry": false,
        "cwd": "${workspaceFolder}",
        "environment": [],
        "externalConsole": false,
        "MIMode": "gdb",
        "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
            }
        ]
    }
    ]
}

一个相关bug

1733285535807

apt-get install gdb

参考 #

c++程序的 cmake编译+vscode来 debug 方法和步骤(ubuntu)_ubuntu c++ debug-CSDN博客

参考 #

CMake 保姆级教程(上) | 爱编程的大丙

install #

# 以v3.25.1版本为例
git clone -b v3.25.1 https://github.com/Kitware/CMake.git 
cd CMake
# 你使用`--prefix`来指定安装路径,或者去掉`--prefix`,安装在默认路径。
./bootstrap --prefix=<安装路径> && make && sudo make install

# 验证
cmake --version

Latex #

latex in vscode #

Hugo #

参考 #

如何用 GitHub Pages + Hugo 搭建个人博客 · KrislinBlog

代理 #

windows11 搭建 WSL2 运行环境(2024)-CSDN 博客