写在前面:
由于时间的不足与学习的碎片化,写博客变得有些奢侈。
但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。
既然如此
不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录,记录笔者认为最通俗、最有帮助的资料,并尽量总结几句话指明本质,以便于日后搜索起来更加容易。
标题的结构如下:“类型”:“知识点”——“简短的解释”
部分内容由于保密协议无法上传。
点击此处进入学习日记的总目录
2022.7.21
一、CMake
:系统找不到指定的文件——解决问题
Cmake Error at CMakeLists.txt:4 (project):
Running
'nmake' '-?'
failed with:
系统找不到指定的文件
-
原因:
vs
版本不对 -
解决办法:
去CMake
里修改使用的vs
版本。
二、CMake
:CMake
指令——构建与编译
- 在编写完
CMakeList.txt
后,进入它的根目录,在该目录的cmd
中运行下面指令
mkdir build
cd build
cmake ..
cmake --build .
cmake --install .
三、CMake
:add_custom_command
——仅学习其中的复制命令
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 - 命令将会在目标构建完后执行。
${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指令
四、CMake
:add_custom_command
不运行——解决问题
CMake Error at CMakeLists.txt:26 (add_custom_command):
add_custom_command Wrong syntax. Unknown type of argument.
-- Configuring incomplete, errors occurred!
- 三种错误可能:
- 保留字 未大写
- 保留字 拼写错误
- 格式不对
链接:
cmake之采坑(一)
五、CMake
:set
——设置变量
- 设置各种变量
六、CMake
:add_custom_target
——仅学习 依赖关系 和 默认执行
- 主要是学习
ALL
和DEPENDS
ALL
:在声明target的时候,可以加上ALL
,这个target
就会加入all target
中,默认进行执行了。DEPENDS
:target之间可以有依赖关系,A依赖B(A depends on B)
,意味着A的build
,需要基于B 已经build
完成。
要实现A依赖B,则要在定义A的时候,加上DEPENDS B
。- 在之前说过,
add_custom_command
有三种运行方式,PRE_BUILD
、PRE_LINK
和POST_BUILD
。
以PRE_BUILD
为例,是在什么之前,这时就需要add_custom_target
的DEPENDS
来确定。
例程如下:
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_command
和 add_custom_target
两个命令,add_custom_target
来确定运行顺序,add_custom_command
实现复制功能。
但对于我这个刚接触CMake
两天的小白,属实有一种盲人摸象的感觉。我以为这两个函数功能是重复的,就在程序里要么有add_custom_targe
,要么有add_custom_command
,结果编译出来总是无法实现功能。
虽然博客里记载的链接不多,但其实今天一共看了这些:
真的是知识如海,难题如山。学习新知识就像在山雾中前行,每一步都包含着对自己的怀疑,希望我们能够不畏艰难,在翻越一座座山时,提高自己的解题效率。