(学习日记)2022.7.21

写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。

既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。


标题的结构如下:“类型”:“知识点”——“简短的解释”

2022.7.21

  • 一、`CMake`:系统找不到指定的文件——解决问题
  • 二、`CMake`:`CMake`指令——构建与编译
  • 三、`CMake`:`add_custom_command`——仅学习其中的复制命令
  • 四、`CMake`:`add_custom_command`不运行——解决问题
  • 五、`CMake`:`set`——设置变量
  • 六、`CMake`:`add_custom_target`——仅学习 依赖关系 和 默认执行
  • 七、题外话

一、CMake:系统找不到指定的文件——解决问题

Cmake Error at CMakeLists.txt:4 (project):
Running
'nmake' '-?'
failed with:
系统找不到指定的文件

(学习日记)2022.7.21_第1张图片

  1. 原因:
    vs版本不对

  2. 解决办法:
    CMake里修改使用的vs版本。

链接:
【记】windows 安装cmake出现的一次问题



二、CMakeCMake指令——构建与编译

  1. 在编写完CMakeList.txt后,进入它的根目录,在该目录的cmd中运行下面指令
mkdir build
cd build
cmake ..
cmake --build .
cmake --install .

链接:
CMake教程
让程序编译更优雅的几个CMake命令



三、CMakeadd_custom_command——仅学习其中的复制命令

  1. TARGET:指定命令运行的目标,即CopyTask
    COMMAND:指定要在构建时执行的命令行;
 ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} ${DIR_SRCS})
 
 add_custom_target(CopyTask ALL DEPENDS ${CMAKE_PROJECT_NAME})

add_custom_command(TARGET CopyTask
  POST_BUILD 
  COMMAND echo ${CMAKE_PROJECT_NAME}
  COMMAND ${CMAKE_COMMAND} -E copy_directory ${PATH}/3rd ${PATH}/build/src/Debug
)

#将 CopyTask 这个 target 依赖在 生成exe 这个进程上
#使用POST_BUILD 方式达到 生成exe进程结束 即运行 CopyTask 操作。
#PRE_BUILD - 命令将会在其他依赖项执行前执行
#PRE_LINK - 命令将会在其他依赖项执行完后执行
#POST_BUILD - 命令将会在目标构建完后执行。
  1. ${CMAKE_COMMAND}CMake的路径。
    -E使CMake运行命令而不是构建。
    copy_directory是复制目录下所有文件,copy是复制指定文件。
    再后面两个就是目录,从前面的目录拷贝到后边的目录(如果使用copy,则是两个包含目录的文件)。

链接:
【CMake】cmake的add_custom_command和add_custom_target指令
cmake整理:在编译时拷贝文件之add_custom_comand 和 add_custom_target
【CMake】cmake的add_custom_command和add_custom_target指令

四、CMakeadd_custom_command不运行——解决问题

CMake Error at CMakeLists.txt:26 (add_custom_command):
  add_custom_command Wrong syntax.  Unknown type of argument.

-- Configuring incomplete, errors occurred!
  1. 三种错误可能:
  • 保留字 未大写
  • 保留字 拼写错误
  • 格式不对

链接:
cmake之采坑(一)



五、CMakeset——设置变量

  1. 设置各种变量

链接:
Cmake入门之——Set方法(六)



六、CMakeadd_custom_target——仅学习 依赖关系 和 默认执行

  1. 主要是学习 ALLDEPENDS
  2. ALL:在声明target的时候,可以加上ALL,这个target就会加入all target中,默认进行执行了。
  3. DEPENDS:target之间可以有依赖关系,A依赖B(A depends on B),意味着A的build,需要基于B 已经build完成。
    要实现A依赖B,则要在定义A的时候,加上DEPENDS B
  4. 在之前说过,add_custom_command有三种运行方式,PRE_BUILDPRE_LINK POST_BUILD
    PRE_BUILD为例,是在什么之前,这时就需要add_custom_targetDEPENDS来确定。
    例程如下:
ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} ${DIR_SRCS})

add_custom_target(CopyTask ALL DEPENDS ${CMAKE_PROJECT_NAME})

add_custom_command(TARGET CopyTask
POST_BUILD 
COMMAND echo ${CMAKE_PROJECT_NAME}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${PATH}/3rd ${PATH}/build/src/Debug
)

#将 CopyTask 这个 target 依赖在 生成exe 这个进程上
#使用POST_BUILD 方式达到 生成exe进程结束 即运行 CopyTask 操作。

链接:
CMake之add_custom_target
cmake(二十七)Cmake中target再理解
makefile中的target到底代表什么?



七、题外话

终于解决了,呜呜呜,今天的博客全部都是围着一个问题转——CMake编译时将动态库复制到Debug文件夹中

这个问题的解决方式倒是不难,要实现编译时复制文件的功能 ,只需要add_custom_commandadd_custom_target两个命令,add_custom_target 来确定运行顺序,add_custom_command实现复制功能。

但对于我这个刚接触CMake两天的小白,属实有一种盲人摸象的感觉。我以为这两个函数功能是重复的,就在程序里要么有add_custom_targe,要么有add_custom_command,结果编译出来总是无法实现功能。

虽然博客里记载的链接不多,但其实今天一共看了这些:
(学习日记)2022.7.21_第2张图片
真的是知识如海,难题如山。学习新知识就像在山雾中前行,每一步都包含着对自己的怀疑,希望我们能够不畏艰难,在翻越一座座山时,提高自己的解题效率。

你可能感兴趣的:(学习日记,学习,CMAKE,CMD)