分类 编程及辅助 下的文章

python: 解压缩rar


问题

所里换了台新电脑,好多环境都要重新配置,之前跟新包提交git已经脚本化,配置的那叫一个舒爽,换完电脑都要重新配置,这里记录一下过程,省着以后又得重新上网找。

下载UnRar

rar官网:点击此处访问
UnRarDLL下载:点击此处下载

安装

直接执行下载包,默认路径C:Program Files (x86)UnrarDLL,默认安装即可

添加环境变量

cmd执行(64位系统):

setx "UNRAR_LIB_PATH" "C:\Program Files (x86)\UnrarDLL\x64\UnRAR64.dll" /m

cmd执行(32位系统):

setx "UNRAR_LIB_PATH" "C:\Program Files (x86)\UnrarDLL\UnRAR.dll" /m

引号防止空格有问题,/m 指的是添加到系统变量中。

添加成功后再打开系统的环境变量如下图:
屏幕截图 2023-01-07 100420.png

python 安装 unrar

pip install unrar

python解压代码

from unrar import rarfile

def decompression(souce_path,target_path):
    shutil.rmtree(target_path)
    os.mkdir(target_path)
    rar=rarfile.RarFile(souce_path)
    print("开始解压文件")
    # 判断同名文件夹是否存在,若不存在则创建同名文件夹
    # print(os.path.splitext(souce_path))
    if os.path.isdir(target_path):
        rf_list = rar.namelist() # 得到压缩包里所有的文件 
        # print('rar文件内容', rf_list) 
    else:
        os.mkdir(target_path)
    rar.extractall(target_path) # 解压文件
    print("文件解压成功")

def main(argv):
    decompression("E:\\test.rar", "E:\\test\\")

CMake: 配置并发编译(添加编译参数)


需求

项目中源文件过多,导致编译过慢,正常在vs中就可以配置并发编译,但是每次cmake之后就要重新在vs中的属性上重新修改一下,太麻烦。不光需要配置并发编译,还要处理release下的调试配置。每次配置其实都要手动操作,很让人头痛。上网找了一些资料发现add_compile_options这个cmake配置项就可以直接添加编译配置项.
微信图片编辑_20221029092751.jpg

代码

add_compile_options("/MP")  # 并发编译配置项

# 配置选项(在cmake中勾选)
option(ReleaseAndDebug "Release And Debug" on)
if(ReleaseAndDebug)
# 在release中开调试
    add_compile_options("/Zi")  # 调试信息格式
    add_compile_options("/Od")  # 禁用优化
endif()

配置及结果


CMake: 文件及文件夹的复制


需求

代码编写过程中写了GTest相关的东西,涉及到了调用三方库的dll及其他相关的东西。这就需要将三方内包含的目录及文件在编译前复制到exe的执行文件目录内。这就需要cmake的add_custom_target命令了。

官方文档:https://cmake.org/cmake/help/v3.22/command/add_custom_target.html?highlight=add_custom

代码

# 归拢需要复制的文件
FILE(GLOB RUNTIME_DEBUG_DLL_FILES CONFIGURE_DEPENDS
    ${ZsOverdrive_CONFIG_PATH}/../../bin/Releasex64/*
)

# 归拢需要复制的文件夹
FILE(GLOB RUNTIME_DEBUG_DLL_DIRS CONFIGURE_DEPENDS
    ${ZsOverdrive_CONFIG_PATH}/../../bin/Releasex64
    ${ZsOverdrive_CONFIG_PATH}/../../driver
)

# 复制相关文件
ADD_CUSTOM_TARGET(CopyRuntimeFiles ALL
    VERBATIM
    COMMAND_EXPAND_LISTS
    # 创建目录
    COMMAND ${CMAKE_COMMAND} -E
        make_directory "${PROJECT_BINARY_DIR}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/"
    # 复制文件
    COMMAND ${CMAKE_COMMAND} -E
        copy_if_different
            "$<$<CONFIG:Release>:${RUNTIME_RELEASE_DLL_FILES}>"
            "$<$<CONFIG:Debug>:${RUNTIME_DEBUG_DLL_FILES}>"
            "${PROJECT_BINARY_DIR}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/"
    # 复制文件夹
    COMMAND ${CMAKE_COMMAND} -E
        copy_directory
            "$<$<CONFIG:Release>:${RUNTIME_DEBUG_DLL_DIRS}>"
            "$<$<CONFIG:Debug>:${RUNTIME_DEBUG_DLL_DIRS}>"
            "${PROJECT_BINARY_DIR}/$<$<CONFIG:Release>:Release>$<$<CONFIG:Debug>:Debug>/"
)

C++: 指针转换


1. 摘要

2. 转换函数

|普通指针|智能指针|说明|
|static_cast|static_pointer_cast|进行上行转换|
|dynamic_cast|dynamic_pointer_cast|进行下行转换|
|const_pointer_cast|const_pointer_cast|一般用于修改底指针|
|reinterpret_cast|reinterpret_pointer_cast|强制类型转换符(慎用)|

3. 示例


C++: cmath里的M_PI


1.摘要

项目开发中挺多需要pi这个东西的,例如弧度与角度的转换,然后自己还要去定义一个宏来使用,一整还冲突。其实cmath.h的头文件里就有关于pi的宏,还有pi/2、pi/4等

2.使用方法

#define _USE_MATH_DEFINES
#include <cmath>

3.补充说明

cmath.h中会包含corect_math_defines.h的相关定义。

    #define M_E        2.71828182845904523536   // e
    #define M_LOG2E    1.44269504088896340736   // log2(e)
    #define M_LOG10E   0.434294481903251827651  // log10(e)
    #define M_LN2      0.693147180559945309417  // ln(2)
    #define M_LN10     2.30258509299404568402   // ln(10)
    #define M_PI       3.14159265358979323846   // pi
    #define M_PI_2     1.57079632679489661923   // pi/2
    #define M_PI_4     0.785398163397448309616  // pi/4
    #define M_1_PI     0.318309886183790671538  // 1/pi
    #define M_2_PI     0.636619772367581343076  // 2/pi
    #define M_2_SQRTPI 1.12837916709551257390   // 2/sqrt(pi)
    #define M_SQRT2    1.41421356237309504880   // sqrt(2)
    #define M_SQRT1_2  0.707106781186547524401  // 1/sqrt(2)

4.注意事项

在头部添加使用2中的使用方法还要注意一下位置,位置不一样也会报找不到的错。
屏幕截图 2022-07-01 143923.png
这样处理才能使用成功。和奇怪,具体也不知道为啥,如果把iostream放在第一位就不能用了。