Cmake - 构建工具

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式建构他的软件,这种可以使用各平台的原生建构系统的能力是 CMake 和 SCons 等其他类似系统的区别之处。

CMake是为了解决美国国家医学图书馆出资的Visible Human Project专案下的Insight Segmentation and Registration Toolkit (ITK) 软件的跨平台建构的需求而创造出来的,其设计受到了Ken Martin开发的pcmaker所影响。pcmaker当初则是为了支持Visualization Toolkit这个开放源代码的三维图形和视觉系统才出现的,VTK也采用了CMake。在设计CMake之时,Kitware公司的Bill Hoffman采用了pcmaker的一些重要想法,加上更多他自己的点子,想把GNU建构系统的一些功能整合进来。CMake最初的实作是在2000年中作的,在2001年初有了急速的进展,许多改良是来自其他把CMake整合到自己的系统中的开发者,比方说,采用CMake作为建构环境的VXL社群就贡献了很多重要的功能,Brad King为了支持CABLE和GCC-XML这套自动包装工具也加了几项功能,奇异公司的研发部门则用在内部的测试系统DART,还有一些功能是为了让VTK可以过渡到CMake和支持(“美国Los Alamos国家实验室”&“洛斯阿拉莫斯国家实验室”)的Advanced Computing Lab的平行视觉系统ParaView而加的。

1.第一个函数

add_executable(hello_vscode_c  src/hello_vscode_c.cpp)

这个函数目的是生成可执行文件。

用src文件夹下的hello_vscode_c.cpp文件生成hello_vscode_c可执行文件。hello_vscode_node.cpp文件是你写的c++源文件,文件名是你创建c++文件时命名的,最终这个文件映射的文件名称为hello_vscode_c,这个名称可以修改,一般源文件和生成的可执行文件的名称设置为一样的,但这两者需要满足计算机语言的命名要求。

可以传入多个源文件,如add_executable(my_node src0.cpp src1.cpp src2.cpp )。函数后面的src0.cpp src1.cpp src2.cpp三个源文件,生成可执行文件my_code这一个可执行文件。

2.第二个函数

target_link_libraries(hello_vscode_c  ${catkin_LIBRARIES} )

这个函数为可执行文件或库添加链接库。

函数中 hello_vscode_c是上一个函数语句生成的可执行文件,${catkin_LIBRARIES} 是ROS的基本库:catkin库。把生成的可执行文件和catkin库链接到一起。

同时,在CMakeListd文件里面,这篇文章中所提到的第二个函数要放在第一个函数后面,因为target_link_libraries函数需要用到add_executable生成的可执行文件。

CMAKE_AR: 静态库的归档工具的名称。这个变量指定了用于创建档案或静态库的程序的名称。
CMAKE_ARGC: 在脚本模式下传给CMake的命令行参数的个数。当运行在-P脚本模式下,CMake设置该变量为命令行参数的个数。
CMAKE_ARGV0: 在脚本模式下传给CMake的命令行的第一个参数。
CMAKE_BINARY_DIR: 构建树的最外层路径,是当前CMake构建树的最外层的全路径。对于在源码中构建的情况,它与CMAKE_SOURCE_DIR的值一样。
CMAKE_BUILD_TOOL: 执行构建过程的工具。该变量设置为CMake构建时输出所需的程序。对于VS 6, CMAKE_BUILD_TOOL设置为msdev, 对于Unix,它被设置为make 或 gmake。 对于 VS 7, 它被设置为devenv. 对于Nmake构建文件,它的值为nmake。
CMAKE_CACHEFILE_DIR: 该变量设置为包含CMakeCache.txt文件的目录的全路径。通常与CMAKE_BINARY_DIR的值一样。
CMAKE_CACHE_MAJOR_VERSION: 用于创建CMakeCache.txt文件的CMake的主版本号。只有当CMake运行于在由一个不同版本的CMake创建的cache文件时,这个变量的值才会不同。
CMAKE_CACHE_MINOR_VERSION: 用于创建CMakeCache.txt文件的CMake的次版本号。只有当CMake运行于在由一个不同版本的CMake创建的cache文件时,这个变量的值才会不同。
CMAKE_CACHE_PATCH_VERSION: 用于创建CMakeCache.txt文件的CMake的补丁版本号。只有当CMake运行于在由一个不同版本的CMake创建的cache文件时,这个变量的值才会不同。
CMAKE_CFG_INTDIR: 构建时对每个配置的输出子目录的引用。对于在一个构建树中支持多个配置的本地构建系统(例如Visual Studio或Xcode),该值就是对指定单个配置输出子目录的一个构建时变量的引用。对于Makefile产生器,该变量解析为”.”。因为在此构建树,只有一个配置。示例的值 如下:
$(IntDir) = Visual Studio 6
$(OutDir) = Visual Studio 7, 8, 9
$(Configuration) = Visual Studio 10
$(CONFIGURATION) = Xcode
. = Make-based tools

由于这些值由本地构建系统解析,该变量只适合用于命令行下,这些命令在构建时被解析。使用例子如下:

add_executable(mytool mytool.c)
add_custom_command(
OUTPUT out.txt
COMMANDC M A K E C U R R E N T B I N A R Y D I R / {CMAKE_CURRENT_BINARY_DIR}/CMAKE 
C

 URRENT 
B

 INARY 
D

 IR/{CMAKE_CFG_INTDIR}/mytool
${CMAKE_CURRENT_SOURCE_DIR}/in.txt out.txt
DEPENDS mytool in.txt
)
add_custom_target(drive ALL DEPENDSout.txt)

CMAKE_COMMAND: 指向cmake可执行程序的全路径。

CMAKE_CROSSCOMPILING: 当前CMake是否是交叉编译。
CMAKE_CTEST_COMMAND: 指向ctest可执行程序的全路径。
CMAKE_CURRENT_BINARY_DIR: 当前正在处理的构建目录。每个由add_subdirectory添加的目录将会在构建树中创建一个构建目录。对于直接在源码目录中编译的情况,当前正在处理的构建目录就是当前源码所在的目录。
CMAKE_CURRENT_LIST_DIR: 当前处理的CMakeLists.txt文件所在的目录。
CMAKE_CURRENT_LIST_FILE: 当前处理的CMakeLists.txt文件的全路径。
CMAKE_CURRENT_LIST_LINE: 当前处理的CMakeLists.txt文件的行号。
CMAKE_CURRENT_SOURCE_DIR: 当前处理的源码路径。
CMAKE_DL_LIBS: 包含dlopen和dlclose的库的名称。
CMAKE_EDIT_COMMAND: cmake-gui或ccmake的全路径。
CMAKE_EXECUTABLE_SUFFIX: 该平台上可执行程序的后缀。
CMAKE_EXTRA_GENERATOR: 额外的用于构建工程的产生器。当使用Eclispse, CodeBlocks或KDevelop产生器时,CMake会产生Makefile文件以及相应的工程文件(CMAKE_GENERATOR)。该IDE工程文件产生器存储于CMAKE_EXTRA_GENERATOR(如:”Eclipse CDT4”)
CMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES: 共享库额外的后缀名。这些共享库不是CMAKE_SHARED_LIBRARY_SUFFIX。在分析某个目标链接的库时,CMake使用该变量识别外部共享库文件。
CMAKE_GENERATOR: 构建工程的产生器。它将产生构建文件 (e.g. “Unix Makefiles”, “Visual Studio 6”, etc.)
CMAKE_HOME_DIRECTORY: 源码树的顶级目录的路径。
CMAKE_IMPORT_LIBRARY_PREFIX: 链接的引入库的前缀。CMAKE_IMPORT_LIBRARY_PREFIX_ overrides this for language .
CMAKE_IMPORT_LIBRARY_SUFFIX: 链接的引入库的后缀。CMAKE_IMPORT_LIBRARY_SUFFIX_ overrides this for language .
CMAKE_LINK_LIBRARY_SUFFIX: 链接的库的后缀。如Windows下是.lib。
CMAKE_MAJOR_VERSION: CMake的主版本号。
CMAKE_MAKE_PROGRAM: 该变量主要是为了向后兼容。参见:CMAKE_BUILD_TOOL.
CMAKE_MINOR_VERSION: CMake的次版本号。
CMAKE_PARENT_LIST_FILE: 正在处理的CMakeLists.txt文件的父CMakelists.txt文件所在的路径。
CMAKE_PATCH_VERSION: CMake的补丁版本。
CMAKE_PROJECT_NAME: 当前工程的名字。
CMAKE_RANLIB: 静态库的随机化工具的名称。
CMAKE_ROOT: cmake的安装目录。
CMAKE_SCRIPT_MODE_FILE: 脚本模式下正在处理的脚本文件。
CMAKE_SHARED_LIBRARY_PREFIX: 链接的共享库的前缀。TCMAKE_SHARED_LIBRARY_PREFIX_ overrides this for language .
CMAKE_SHARED_LIBRARY_SUFFIX:链接的共享库的后缀。CMAKE_SHARED_LIBRARY_SUFFIX_ overrides this for language .
CMAKE_SHARED_MODULE_PREFIX: 链接的可加载模块的前缀。CMAKE_SHARED_MODULE_PREFIX_ overrides this for language .
CMAKE_SHARED_MODULE_SUFFIX: 链接的可加载模块的后缀。CMAKE_SHARED_MODULE_SUFFIX_ overrides this for language .
CMAKE_SIZEOF_VOID_P: void指针的大小。
CMAKE_SKIP_RPATH: 如果为真,将不添加运行时路径信息。默认情况下是如果平台支持运行时信息,将会添加运行时信息到可执行程序当中。这样从构建树中运行程序将很容易。为了在安装过程中忽略掉RPATH,使用CMAKE_SKIP_INSTALL_RPATH。
CMAKE_SOURCE_DIR: 源码树的最顶级目录。当在源码中编译时,与CMAKE_BINARY_DIR的值一致。
CMAKE_STANDARD_LIBRARIES: 链接到每个可执行程序和共享库的标准库。它包含一系列库。
CMAKE_STATIC_LIBRARY_PREFIX:链接的静态库的前缀。CMAKE_STATIC_LIBRARY_PREFIX_ overrides this for language .
CMAKE_STATIC_LIBRARY_SUFFIX: 链接的静态库的后缀。CMAKE_STATIC_LIBRARY_SUFFIX_ overrides this for language .
CMAKE_TWEAK_VERSION: CMake的tweak版本。
CMAKE_USING_VC_FREE_TOOLS: 当使用了免费的Visual tools时为真。通常当编译器是Visual Studio免费工具时,该变量设为真。
CMAKE_VERBOSE_MAKEFILE: 当开启时创建verbose的构建文件。默认为false.当设置为真时,CMake会产生verbose构建文件,它会显示使用到的每个命令行。
CMAKE_VERSION: CMake的完全版本号。格式:major.minor.patch[.tweak[-id]]。
PROJECT_BINARY_DIR: 工程的构建目录。
PROJECT_NAME: 工程名。
PROJECT_SOURCE_DIR: 当前工程的顶级目录。
[Project name]_BINARY_DIR: 对应工程的顶级构建目录。
[Project name]_SOURCE_DIR: 对应工程的源码目录。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值