我们承担ROS,FastDDS等通信中间件,C++,cmake等技术的项目开发和专业指导和培训,有多年相关工作经验,质量有保证,如有需要请私信联系。
构建系统介绍
为生成一个构建系统,必须要选择以下:
- Source Tree:包含源文件的顶级目录,必须包含顶级的CMakeLists.txt
- Build Tree:cmake会生成CMakeCache.txt文件标识这个目录为build tree,并将已存在的信息比如构建配置选项等信息写入该文件
- Generator:通过
cmake --help
可以查看有哪些生成器。通过-G选项指定生成器
生成构建系统
通过运行以下命令指定source和build trees并生成一个构建系统
cmake [<options>] <path-to-source>
:<path-to-source>
是source tree,当前目录作为build tree。source tree必须要包含CMakeLists.txt,必须不能包含CMakeCache.txt,因为后者标识了一个现有的构建树cmake [<options>] <path-to-existing-build>
:使用<path-to-existing-build>
作为build tree,并从CMakeCache.txt文件中加载source tree的路径,这个必须要在上一步的camke运行中生成。cmake [<options>] -S <path-to-source> -B <path-to-build>
:<path-to-source>
作为source tree,<path-to-build>
作为build tree,source tree必须要包含CMakeLists.txt,build tree会自动创建。如:
cmake -S src -B build
<options>
可以为以下:
-H.
:配置阶段执行,表示在当前目录下搜索CMakeLists.txt文件, 并不是所有的cmake版本都支持(比如win下不支持),更推荐的方式是下面使用-S或者直接使用cmake .
-S <path-to-source>
CMake要构建的项目的根目录-B <path-to-build>
要构建的build目录。如果该目录不存在会自动创建-C <initial-cache>
预加载脚本以填充cache。当cmake第一次在空的build tree中运行时会创建CMakeCache.txt并填充一些常用的设置信息。这条指令指定要预填充的内容。加载的词条较project的默认值而言有更高的优先级。指定的文件必须是包含set()命令的CACHE选项的CMake风格文件。(有什么用?TODO)-D <var>:<type>=<value>, -D <var>=<value>
用于为CMake设置任何类型的变量:逻辑变量,路径等等,这个变量可以在CMakeLists中使用;创建或更新CACHE 词条-U <globbing_expr>
-G <generator-name>
:切换生成器,可以通过cmake --help
查看有哪些生成器-T <toolset-spec>
-A <platform-name>
-Wno-dev
-Wdev
-Werror=dev
-Wno-error=dev
-Wdeprecated
-Wno-deprecated
-Werror=deprecated
-Wno-error=deprecated
-L[A][H]
-N
--graphviz=[file]
--system-information [file]
--log-level=<ERROR|WARNING|NOTICE|STATUS|VERBOSE|DEBUG|TRACE>
--log-context
--debug-trycompile
--debug-output
--debug-find
--trace
--trace-expand
--trace-format=<format>
--trace-source=<file>
--trace-redirect=<file>
--warn-uninitialized
--warn-unused-vars
--no-warn-unused-cli
--check-system-vars
--profiling-output=<path>
--profiling-format=<file>
--preset <preset>, --preset=<preset>
--list-presets, --list-presets=<[configure | build | test | all]>
构建项目
cmake提供了命令行签名去构建已经存在的binary tree。运行cmake --build
快速查看帮助信息
cmake --build [<dir> | --preset <preset>] [<options>] [-- <build-tool-options>]
命令参数:
- -
-build <dir>
要构建的目录,这个参数是必须的且第一个 --preset <preset>, --preset=<preset>
使用 build preset指定构建选项。当前工作目录必须包含CMake preset文件。--list-presets
--parallel [<jobs>], -j [<jobs>]
构建时最大的并行处理器个数。如果被忽略的话使用默认数量。如果环境变量CMAKE_BUILD_PARALLEL_LEVEL
指定默认数量--target <tgt>..., -t <tgt>...
目标<tgt>
代替默认的目标,可以用空格分隔,指定多个目标--config <cfg>
对于多配置工具,选择使用cfg--clean-first
构建时先clean,再构建。如果只clean,使用--target clean
--use-stderr
--verbose, -v
CMake构建时,如果确定使用了哪些编译标志?可以通过设置VERBOSE=1查看(实际测试小写无效,且–和VERBOSE之间要有空格),如:cmake --build ./build -- VERBOSE=1
--
为本地tool预留的
cmake会生成很多文件,可以使用cmake --build . --target <target-name>
,target-name为以下命令:
all
:默认目标,将在项目中构建所有目标clean
:删除所有生成的文件rebuild_cache
:将调用CMake为源文件生成依赖——?edit_cache
:这个目标允许直接编辑缓存——有啥用?test
:将在CTest的帮助下运行测试套件install
:将按照安装规则安装package
:将调用CPack为项目生成可分发的包
安装项目
cmake提供命令行工具用于安装project binary tree。在构建完成之后运行安装命令。运行cmake --install
查看帮助
cmake --install <dir> [<options>]
参数说明:
--install <dir>
安装命令,是必须的且是第一位,<dir>
是cmake_install.cmake的位置--config <cfg>
对于多个配置生成器,选择使用cfg--component <comp>
只安装comp--default-directory-permissions <permissions>
安装的默认目录,权限(permissions)格式为<u=rwx,g=rx,o=rx>
--prefix <prefix>
覆盖安装前缀CMAKE_INSTALL_PREFIX
--strip
安装前先strip- -v, --verbose 允许verbose输出。如果环境变量VERBOSE被设置了这个选项会被忽略。
打开项目
cmake --open <dir>
打开一个已存在的项目。
运行脚本
cmake [{-D <var>=<value>}...] -P <cmake-script-file> [-- <unparsed-options>...]
运行命令行工具
cmake通过签名提供内置的命令行工具。通过运行cmake -E 或 cmake -E help查看。有以下内容:
capabilities
:以json的形式输出cmake capabilities。cat <files>...
chdir <dir> <cmd> [<arg>...]
compare_files [--ignore-eol] <file1> <file2>
copy <file>... <destination>
copy_directory <dir>... <destination>
copy_if_different <file>... <destination>
create_symlink <old> <new>
create_hardlink <old> <new>
echo [<string>...]
echo_append [<string>...]
env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]...
environment
false
make_directory <dir>...
md5sum <file>...
sha1sum <file>...
sha224sum <file>...
sha256sum <file>...
sha384sum <file>...
sha512sum <file>...
remove [-f] <file>...
remove_directory <dir>...
rename <oldname> <newname>
rm [-rRf] <file> <dir>...
server
sleep <number>...
tar [cxt][vf][zjJ] file.tar [<options>] [--] [<pathname>...]
time <command> [<args>...]
touch <file>...
touch_nocreate <file>...
true