
毕设项目选择使用 CMake 进行管理,踩了不少坑,这里继续做总结,来记录碰到的各种各样的问题。
自动查找源代码文件 -- file 命令
file 命令有很多功能,能实现创建目录,文件复制,重命名等文件功能,命令 cmake 执行时立即有作用,同时还可以改变文件的权限(虽然我更偏向于使用 shell 来完成工作,毕竟可操作的地方更多一些)。这里介绍其查找的用法 -- GLOB 和 GLOB_RECURSE 子命令。
命令格式:
file(GLOB|GLOB_RECURSE <var> <pattern> [<pattern> ...])GLOB -- 在目录下查找符合 <patter> 的所有文件。 GLOB_RECURSE -- 这个命令则是会遍历目录下的所有文件,包括子目录,并把符合要求的文件全都找到。例如 file(GLOB_RECURSE SRC ./src/*.cpp) 将 src 目录下的所有以 cpp 结尾的文件全都找到。
这个在调用 add_executable() 的时候格外好用,就不需要每次新加文件都要在 CMakeList.txt 中添加了,减少改动的次数。
在 CMake 阶段处理好所有事情 -- execute_process
这个命令用于执行外部的命令行程序,我一般选择使用它来运行自己的脚本,因为 CMake 的限制,平台相关的的细节无法在 CMake 上继续完成,就可以写一个脚本来用这个命令调用,这个命令在脚本执行完成后 CMake 指令才会继续。
命令格式:
execute_process(COMMAND <command> <arg1> ...
[COMMAND] ...
WORKING_DIRECTORY <dir_path>)这句话相当于在命令行里调用程序,命令是一条接一条的执行,所以可以一次写多个命令,这样就可以愉快的调用自己的脚本来处理文件和拷贝依赖库了。
CMake 的打印调试法 -- message
message 命令会在 cmake 命令执行时输出相应的内容,可以指定内容的类型,如 STATUS、WARNING、FATAL_ERROR 等,有些类型会影响到 cmake 命令的执行,比如 FATAL_ERROR,输出此类信息会是 cmake 命令终止。在检查变量的时候很有用。
命令格式:
message(<mode> "message to display")<mode> 有很多可以选:
<none>不填,直接输出的信息STATUS表示运行状态的信息WARNING警告,但程序不会停止AUTHOR_WARNING给开发者的警告,程序不会停止SEND_ERROR抛出错误,程序不会终止,但是不会生成 MakefileFATAL_ERROR抛出错误,cmake 程序终止DEPRECATION除非设置了CMAKE_ERROR_DEPRECATED或CMAKE_WARN_DEPRECATED才会显示,否则不输出
这些东西在命令行执行 cmake 时,只有 STATUS 输出到 stdout 其他的都输出值 stderr。