博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CMake学习之路
阅读量:2383 次
发布时间:2019-05-10

本文共 11142 字,大约阅读时间需要 37 分钟。

一 为什么使用CMake

 CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目。通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(make install)、测试安装的程序是否能正确执行(make test,或者ctest)、生成当前平台的安装包(make package)、生成源码包(make package_source)、产生Dashboard显示数据并上传等高级功能,只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试用例。如果有嵌套目录,子目录下可以有自己的CMakeLists.txt。总之很强大!

二 CMake安装

安装很简单

三 CMake基本使用和语法

1

command (args ...)

command 是命令名,大小写无关(注意:变量是大小写相关的)

args 是参数,参数如果有空格,应该用双引号括起来

变量引用用${VAR}语法

set命令可以将多变量可以放在一起,合成为一个变量,如下所示

1

2

set(Foo a b c)

command(${Foo})=command(a b c)<br>command("${Foo}")=command("a b c")

CMake可以直接获取系统环境变量和Windows注册值。为了获取系统环境变量,需要语法

1

$ENV{VAR}

四 CMake中的Hello World

CMakeLists.txt文件中

1

2

project(Hello)

add_executable(Hello Hello.c)

这只是最简单的版本,下面还有一个复杂一些的版本

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

cmake_minimum_required (2.6)

project (HELLO)

set (HELLO_SRCS Hello.c File2.c File3.c)

if (win32)

    set (HELLO_SRCS ${HELLO_SRCS} WinSupport.c)

else ()

    set (HELLO_SRCS  ${HELLO_SRCS} UnixSupport.c)

endif ()

 

add_executable (Hello ${HELLO_SRCS})

 

#look for Tcl library

find_library (TCL_LIBRARY NAMES tcl tcl84 tcl83 tcl82 tcl80 PATHS /usr/lib /usr/local/lib)

 

if (TCL_LIBRARY)

    target_link_library (HELLO ${TCL_LIBRARY})

endif ()

五 Run Cmake

cd Hello

cmake ..

make 

六 CMake帮助文档

安装完之后,进入/usr/share/cmake

目录形式如下

复制代码

.├── completions├── editors│   ├── emacs│   └── vim├── Help│   ├── command│   ├── generator│   ├── include│   ├── manual│   ├── module│   ├── policy│   ├── prop_cache│   ├── prop_dir│   ├── prop_gbl│   ├── prop_inst│   ├── prop_sf│   ├── prop_test│   ├── prop_tgt│   ├── release│   └── variable├── include├── Modules│   ├── CMakeAddFortranSubdirectory│   ├── Compiler│   ├── CompilerId│   ├── FindCUDA│   ├── FortranCInterface│   │   └── Verify│   ├── IntelVSImplicitPath│   ├── Internal│   └── Platform└── Templates    └── Windows

复制代码

其中需要注意的是Help目录和Modules目录,Help目录为帮助文档,Modulues目录为find_package指令的查找目录之一。

cmake --help

我们可以查看cmake帮助,这个很全,比如显示cmake的指令

cmake --help-command-list

复制代码

add_compile_optionsadd_custom_commandadd_custom_targetadd_definitionsadd_dependenciesadd_executableadd_libraryadd_subdirectoryadd_testaux_source_directorybreakbuild_commandbuild_namecmake_host_system_informationcmake_minimum_requiredcmake_policyconfigure_filecontinuecreate_test_sourcelistctest_buildctest_configurectest_coveragectest_empty_binary_directoryctest_memcheckctest_read_custom_filesctest_run_scriptctest_sleepctest_startctest_submitctest_testctest_updatectest_uploaddefine_propertyelseelseifenable_languageenable_testingendforeachendfunctionendifendmacroendwhileexec_programexecute_processexportexport_library_dependenciesfilefind_filefind_libraryfind_packagefind_pathfind_programfltk_wrap_uiforeachfunctionget_cmake_propertyget_directory_propertyget_filename_componentget_propertyget_source_file_propertyget_target_propertyget_test_propertyifincludeinclude_directoriesinclude_external_msprojectinclude_regular_expressioninstallinstall_filesinstall_programsinstall_targetslink_directorieslink_librarieslistload_cacheload_commandmacromake_directorymark_as_advancedmathmessageoptionoutput_required_filesprojectqt_wrap_cppqt_wrap_uiremoveremove_definitionsreturnseparate_argumentssetset_directory_propertiesset_propertyset_source_files_propertiesset_target_propertiesset_tests_propertiessite_namesource_groupstringsubdir_dependssubdirstarget_compile_definitionstarget_compile_featurestarget_compile_optionstarget_include_directoriestarget_link_librariestarget_sourcestry_compiletry_rununsetuse_mangled_mesautility_sourcevariable_requiresvariable_watchwhilewrite_file

复制代码

再如cmake定义的变量

cmake --help-variable-list

复制代码

_BINARY_DIR
_SOURCE_DIR
_VERSION
_VERSION_MAJOR
_VERSION_MINOR
_VERSION_PATCH
_VERSION_TWEAKAPPLEBORLANDBUILD_SHARED_LIBSCMAKE_
_POSTFIXCMAKE_
_ARCHIVE_APPENDCMAKE_
_ARCHIVE_CREATECMAKE_
_ARCHIVE_FINISHCMAKE_
_COMPILERCMAKE_
_COMPILER_ABICMAKE_
_COMPILER_EXTERNAL_TOOLCHAINCMAKE_
_COMPILER_IDCMAKE_
_COMPILER_LOADEDCMAKE_
_COMPILER_TARGETCMAKE_
_COMPILER_VERSIONCMAKE_
_COMPILE_OBJECTCMAKE_
_CREATE_SHARED_LIBRARYCMAKE_
_CREATE_SHARED_MODULECMAKE_
_CREATE_STATIC_LIBRARYCMAKE_
_FLAGSCMAKE_
_FLAGS_DEBUGCMAKE_
_FLAGS_MINSIZERELCMAKE_
_FLAGS_RELEASECMAKE_
_FLAGS_RELWITHDEBINFOCMAKE_
_IGNORE_EXTENSIONSCMAKE_
_IMPLICIT_INCLUDE_DIRECTORIESCMAKE_
_IMPLICIT_LINK_DIRECTORIESCMAKE_
_IMPLICIT_LINK_FRAMEWORK_DIRECTORIESCMAKE_
_IMPLICIT_LINK_LIBRARIESCMAKE_
_LIBRARY_ARCHITECTURECMAKE_
_LINKER_PREFERENCECMAKE_
_LINKER_PREFERENCE_PROPAGATESCMAKE_
_LINK_EXECUTABLECMAKE_
_OUTPUT_EXTENSIONCMAKE_
_PLATFORM_IDCMAKE_
_SIMULATE_IDCMAKE_
_SIMULATE_VERSIONCMAKE_
_SIZEOF_DATA_PTRCMAKE_
_SOURCE_FILE_EXTENSIONSCMAKE_
_VISIBILITY_PRESETCMAKE_ABSOLUTE_DESTINATION_FILESCMAKE_ANDROID_APICMAKE_ANDROID_API_MINCMAKE_ANDROID_GUICMAKE_APPBUNDLE_PATHCMAKE_ARCMAKE_ARCHIVE_OUTPUT_DIRECTORYCMAKE_ARGCCMAKE_ARGV0CMAKE_AUTOMOCCMAKE_AUTOMOC_MOC_OPTIONSCMAKE_AUTOMOC_RELAXED_MODECMAKE_AUTORCCCMAKE_AUTORCC_OPTIONSCMAKE_AUTOUICCMAKE_AUTOUIC_OPTIONSCMAKE_BACKWARDS_COMPATIBILITYCMAKE_BINARY_DIRCMAKE_BUILD_TOOLCMAKE_BUILD_TYPECMAKE_BUILD_WITH_INSTALL_RPATHCMAKE_CACHEFILE_DIRCMAKE_CACHE_MAJOR_VERSIONCMAKE_CACHE_MINOR_VERSIONCMAKE_CACHE_PATCH_VERSIONCMAKE_CFG_INTDIRCMAKE_CL_64CMAKE_COLOR_MAKEFILECMAKE_COMMANDCMAKE_COMPILER_2005CMAKE_COMPILER_IS_GNU
CMAKE_COMPILE_PDB_OUTPUT_DIRECTORYCMAKE_COMPILE_PDB_OUTPUT_DIRECTORY_
CMAKE_CONFIGURATION_TYPESCMAKE_CROSSCOMPILINGCMAKE_CTEST_COMMANDCMAKE_CURRENT_BINARY_DIRCMAKE_CURRENT_LIST_DIRCMAKE_CURRENT_LIST_FILECMAKE_CURRENT_LIST_LINECMAKE_CURRENT_SOURCE_DIRCMAKE_CXX_COMPILE_FEATURESCMAKE_CXX_EXTENSIONSCMAKE_CXX_STANDARDCMAKE_CXX_STANDARD_REQUIREDCMAKE_C_COMPILE_FEATURESCMAKE_C_EXTENSIONSCMAKE_C_STANDARDCMAKE_C_STANDARD_REQUIREDCMAKE_DEBUG_POSTFIXCMAKE_DEBUG_TARGET_PROPERTIESCMAKE_DISABLE_FIND_PACKAGE_
CMAKE_DL_LIBSCMAKE_EDIT_COMMANDCMAKE_ERROR_DEPRECATEDCMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATIONCMAKE_EXECUTABLE_SUFFIXCMAKE_EXE_LINKER_FLAGSCMAKE_EXE_LINKER_FLAGS_
CMAKE_EXPORT_NO_PACKAGE_REGISTRYCMAKE_EXTRA_GENERATORCMAKE_EXTRA_SHARED_LIBRARY_SUFFIXESCMAKE_FIND_LIBRARY_PREFIXESCMAKE_FIND_LIBRARY_SUFFIXESCMAKE_FIND_NO_INSTALL_PREFIXCMAKE_FIND_PACKAGE_NAMECMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRYCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRYCMAKE_FIND_PACKAGE_WARN_NO_MODULECMAKE_FIND_ROOT_PATHCMAKE_FIND_ROOT_PATH_MODE_INCLUDECMAKE_FIND_ROOT_PATH_MODE_LIBRARYCMAKE_FIND_ROOT_PATH_MODE_PACKAGECMAKE_FIND_ROOT_PATH_MODE_PROGRAMCMAKE_FRAMEWORK_PATHCMAKE_Fortran_FORMATCMAKE_Fortran_MODDIR_DEFAULTCMAKE_Fortran_MODDIR_FLAGCMAKE_Fortran_MODOUT_FLAGCMAKE_Fortran_MODULE_DIRECTORYCMAKE_GENERATORCMAKE_GENERATOR_PLATFORMCMAKE_GENERATOR_TOOLSETCMAKE_GNUtoMSCMAKE_HOME_DIRECTORYCMAKE_HOST_APPLECMAKE_HOST_SYSTEMCMAKE_HOST_SYSTEM_NAMECMAKE_HOST_SYSTEM_PROCESSORCMAKE_HOST_SYSTEM_VERSIONCMAKE_HOST_UNIXCMAKE_HOST_WIN32CMAKE_IGNORE_PATHCMAKE_IMPORT_LIBRARY_PREFIXCMAKE_IMPORT_LIBRARY_SUFFIXCMAKE_INCLUDE_CURRENT_DIRCMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACECMAKE_INCLUDE_DIRECTORIES_BEFORECMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORECMAKE_INCLUDE_PATHCMAKE_INSTALL_DEFAULT_COMPONENT_NAMECMAKE_INSTALL_MESSAGECMAKE_INSTALL_NAME_DIRCMAKE_INSTALL_PREFIXCMAKE_INSTALL_RPATHCMAKE_INSTALL_RPATH_USE_LINK_PATHCMAKE_INTERNAL_PLATFORM_ABICMAKE_JOB_POOL_COMPILECMAKE_JOB_POOL_LINKCMAKE_LIBRARY_ARCHITECTURECMAKE_LIBRARY_ARCHITECTURE_REGEXCMAKE_LIBRARY_OUTPUT_DIRECTORYCMAKE_LIBRARY_PATHCMAKE_LIBRARY_PATH_FLAGCMAKE_LINK_DEF_FILE_FLAGCMAKE_LINK_DEPENDS_NO_SHAREDCMAKE_LINK_INTERFACE_LIBRARIESCMAKE_LINK_LIBRARY_FILE_FLAGCMAKE_LINK_LIBRARY_FLAGCMAKE_LINK_LIBRARY_SUFFIXCMAKE_MACOSX_BUNDLECMAKE_MACOSX_RPATHCMAKE_MAJOR_VERSIONCMAKE_MAKE_PROGRAMCMAKE_MAP_IMPORTED_CONFIG_
CMAKE_MATCH_COUNTCMAKE_MFC_FLAGCMAKE_MINIMUM_REQUIRED_VERSIONCMAKE_MINOR_VERSIONCMAKE_MODULE_LINKER_FLAGSCMAKE_MODULE_LINKER_FLAGS_
CMAKE_MODULE_PATHCMAKE_NOT_USING_CONFIG_FLAGSCMAKE_NO_BUILTIN_CHRPATHCMAKE_NO_SYSTEM_FROM_IMPORTEDCMAKE_OBJECT_PATH_MAXCMAKE_OSX_ARCHITECTURESCMAKE_OSX_DEPLOYMENT_TARGETCMAKE_OSX_SYSROOTCMAKE_PARENT_LIST_FILECMAKE_PATCH_VERSIONCMAKE_PDB_OUTPUT_DIRECTORYCMAKE_PDB_OUTPUT_DIRECTORY_
CMAKE_POLICY_DEFAULT_CMP
CMAKE_POLICY_WARNING_CMP
CMAKE_POSITION_INDEPENDENT_CODECMAKE_PREFIX_PATHCMAKE_PROGRAM_PATHCMAKE_PROJECT_
_INCLUDECMAKE_PROJECT_NAMECMAKE_RANLIBCMAKE_ROOTCMAKE_RUNTIME_OUTPUT_DIRECTORYCMAKE_SCRIPT_MODE_FILECMAKE_SHARED_LIBRARY_PREFIXCMAKE_SHARED_LIBRARY_SUFFIXCMAKE_SHARED_LINKER_FLAGSCMAKE_SHARED_LINKER_FLAGS_
CMAKE_SHARED_MODULE_PREFIXCMAKE_SHARED_MODULE_SUFFIXCMAKE_SIZEOF_VOID_PCMAKE_SKIP_BUILD_RPATHCMAKE_SKIP_INSTALL_ALL_DEPENDENCYCMAKE_SKIP_INSTALL_RPATHCMAKE_SKIP_INSTALL_RULESCMAKE_SKIP_RPATHCMAKE_SOURCE_DIRCMAKE_STAGING_PREFIXCMAKE_STANDARD_LIBRARIESCMAKE_STATIC_LIBRARY_PREFIXCMAKE_STATIC_LIBRARY_SUFFIXCMAKE_STATIC_LINKER_FLAGSCMAKE_STATIC_LINKER_FLAGS_
CMAKE_SYSROOTCMAKE_SYSTEMCMAKE_SYSTEM_IGNORE_PATHCMAKE_SYSTEM_INCLUDE_PATHCMAKE_SYSTEM_LIBRARY_PATHCMAKE_SYSTEM_NAMECMAKE_SYSTEM_PREFIX_PATHCMAKE_SYSTEM_PROCESSORCMAKE_SYSTEM_PROGRAM_PATHCMAKE_SYSTEM_VERSIONCMAKE_TOOLCHAIN_FILECMAKE_TRY_COMPILE_CONFIGURATIONCMAKE_TWEAK_VERSIONCMAKE_USER_MAKE_RULES_OVERRIDECMAKE_USER_MAKE_RULES_OVERRIDE_
CMAKE_USE_RELATIVE_PATHSCMAKE_VERBOSE_MAKEFILECMAKE_VERSIONCMAKE_VISIBILITY_INLINES_HIDDENCMAKE_VS_DEVENV_COMMANDCMAKE_VS_INTEL_Fortran_PROJECT_VERSIONCMAKE_VS_MSBUILD_COMMANDCMAKE_VS_MSDEV_COMMANDCMAKE_VS_NsightTegra_VERSIONCMAKE_VS_PLATFORM_NAMECMAKE_VS_PLATFORM_TOOLSETCMAKE_WARN_DEPRECATEDCMAKE_WARN_ON_ABSOLUTE_INSTALL_DESTINATIONCMAKE_WIN32_EXECUTABLECMAKE_XCODE_ATTRIBUTE_
CMAKE_XCODE_PLATFORM_TOOLSETCPACK_ABSOLUTE_DESTINATION_FILESCPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORYCPACK_ERROR_ON_ABSOLUTE_INSTALL_DESTINATIONCPACK_INCLUDE_TOPLEVEL_DIRECTORYCPACK_INSTALL_SCRIPTCPACK_PACKAGING_INSTALL_PREFIXCPACK_SET_DESTDIRCPACK_WARN_ON_ABSOLUTE_INSTALL_DESTINATIONCTEST_BINARY_DIRECTORYCTEST_BUILD_COMMANDCTEST_BUILD_NAMECTEST_BZR_COMMANDCTEST_BZR_UPDATE_OPTIONSCTEST_CHECKOUT_COMMANDCTEST_CONFIGURATION_TYPECTEST_CONFIGURE_COMMANDCTEST_COVERAGE_COMMANDCTEST_COVERAGE_EXTRA_FLAGSCTEST_CURL_OPTIONSCTEST_CVS_CHECKOUTCTEST_CVS_COMMANDCTEST_CVS_UPDATE_OPTIONSCTEST_DROP_LOCATIONCTEST_DROP_METHODCTEST_DROP_SITECTEST_DROP_SITE_CDASHCTEST_DROP_SITE_PASSWORDCTEST_DROP_SITE_USERCTEST_GIT_COMMANDCTEST_GIT_UPDATE_CUSTOMCTEST_GIT_UPDATE_OPTIONSCTEST_HG_COMMANDCTEST_HG_UPDATE_OPTIONSCTEST_MEMORYCHECK_COMMANDCTEST_MEMORYCHECK_COMMAND_OPTIONSCTEST_MEMORYCHECK_SANITIZER_OPTIONSCTEST_MEMORYCHECK_SUPPRESSIONS_FILECTEST_MEMORYCHECK_TYPECTEST_NIGHTLY_START_TIMECTEST_P4_CLIENTCTEST_P4_COMMANDCTEST_P4_OPTIONSCTEST_P4_UPDATE_OPTIONSCTEST_SCP_COMMANDCTEST_SITECTEST_SOURCE_DIRECTORYCTEST_SVN_COMMANDCTEST_SVN_OPTIONSCTEST_SVN_UPDATE_OPTIONSCTEST_TEST_TIMEOUTCTEST_TRIGGER_SITECTEST_UPDATE_COMMANDCTEST_UPDATE_OPTIONSCTEST_UPDATE_VERSION_ONLYCTEST_USE_LAUNCHERSCYGWINENVEXECUTABLE_OUTPUT_PATHLIBRARY_OUTPUT_PATHMINGWMSVCMSVC10MSVC11MSVC12MSVC14MSVC60MSVC70MSVC71MSVC80MSVC90MSVC_IDEMSVC_VERSIONPROJECT_BINARY_DIRPROJECT_NAMEPROJECT_SOURCE_DIRPROJECT_VERSIONPROJECT_VERSION_MAJORPROJECT_VERSION_MINORPROJECT_VERSION_PATCHPROJECT_VERSION_TWEAKUNIXWIN32WINCEWINDOWS_PHONEWINDOWS_STOREXCODE_VERSION

复制代码

七 深入学习cmake

cmake实践

mastering cmake

cmake的帮助文档

转载地址:http://wobab.baihongyu.com/

你可能感兴趣的文章
mongodb分片搭建
查看>>
12c新的自增键方式
查看>>
mongodb将备机提升为主机
查看>>
12c新的分页方式
查看>>
leveldb代码精读 skiplist
查看>>
leveldb代码精读 数据库启动和初始化
查看>>
library cache pin导致业务阻断
查看>>
精算业务死锁的具体分析
查看>>
leveldb代码精读 插入操作
查看>>
mysql代码阅读-插件加载及存储引擎接入
查看>>
12c ILM数据生命周期管理
查看>>
mysql代码阅读-frm文件格式解析
查看>>
mongodb dml
查看>>
poll与socket
查看>>
mongodb分片balance
查看>>
共享内存
查看>>
c语言实现linux抓包
查看>>
dump索引结构
查看>>
leveldb代码精读 内存池Arena
查看>>
perl网络编程
查看>>