CMake学习之路


https://www.cnblogs.com/qixianyu/p/6574048.html


CMake学习之路

一 为什么使用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_options
add_custom_command
add_custom_target
add_definitions
add_dependencies
add_executable
add_library
add_subdirectory
add_test
aux_source_directory
break
build_command
build_name
cmake_host_system_information
cmake_minimum_required
cmake_policy
configure_file
continue
create_test_sourcelist
ctest_build
ctest_configure
ctest_coverage
ctest_empty_binary_directory
ctest_memcheck
ctest_read_custom_files
ctest_run_script
ctest_sleep
ctest_start
ctest_submit
ctest_test
ctest_update
ctest_upload
define_property
else
elseif
enable_language
enable_testing
endforeach
endfunction
endif
endmacro
endwhile
exec_program
execute_process
export
export_library_dependencies
file
find_file
find_library
find_package
find_path
find_program
fltk_wrap_ui
foreach
function
get_cmake_property
get_directory_property
get_filename_component
get_property
get_source_file_property
get_target_property
get_test_property
if
include
include_directories
include_external_msproject
include_regular_expression
install
install_files
install_programs
install_targets
link_directories
link_libraries
list
load_cache
load_command
macro
make_directory
mark_as_advanced
math
message
option
output_required_files
project
qt_wrap_cpp
qt_wrap_ui
remove
remove_definitions
return
separate_arguments
set
set_directory_properties
set_property
set_source_files_properties
set_target_properties
set_tests_properties
site_name
source_group
string
subdir_depends
subdirs
target_compile_definitions
target_compile_features
target_compile_options
target_include_directories
target_link_libraries
target_sources
try_compile
try_run
unset
use_mangled_mesa
utility_source
variable_requires
variable_watch
while
write_file


再如cmake定义的变量

cmake --help-variable-list
<PROJECT-NAME>_BINARY_DIR
<PROJECT-NAME>_SOURCE_DIR
<PROJECT-NAME>_VERSION
<PROJECT-NAME>_VERSION_MAJOR
<PROJECT-NAME>_VERSION_MINOR
<PROJECT-NAME>_VERSION_PATCH
<PROJECT-NAME>_VERSION_TWEAK
APPLE
BORLAND
BUILD_SHARED_LIBS
CMAKE_<CONFIG>_POSTFIX
CMAKE_<LANG>_ARCHIVE_APPEND
CMAKE_<LANG>_ARCHIVE_CREATE
CMAKE_<LANG>_ARCHIVE_FINISH
CMAKE_<LANG>_COMPILER
CMAKE_<LANG>_COMPILER_ABI
CMAKE_<LANG>_COMPILER_EXTERNAL_TOOLCHAIN
CMAKE_<LANG>_COMPILER_ID
CMAKE_<LANG>_COMPILER_LOADED
CMAKE_<LANG>_COMPILER_TARGET
CMAKE_<LANG>_COMPILER_VERSION
CMAKE_<LANG>_COMPILE_OBJECT
CMAKE_<LANG>_CREATE_SHARED_LIBRARY
CMAKE_<LANG>_CREATE_SHARED_MODULE
CMAKE_<LANG>_CREATE_STATIC_LIBRARY
CMAKE_<LANG>_FLAGS
CMAKE_<LANG>_FLAGS_DEBUG
CMAKE_<LANG>_FLAGS_MINSIZEREL
CMAKE_<LANG>_FLAGS_RELEASE
CMAKE_<LANG>_FLAGS_RELWITHDEBINFO
CMAKE_<LANG>_IGNORE_EXTENSIONS

cmake --help-variable-list

CMAKE_<LANG>_IMPLICIT_INCLUDE_DIRECTORIES
CMAKE_<LANG> _IMPLICIT_LINK_DIRECTORIESCMAKE_<LANG> _IMPLICIT_LINK_FRAMEWORK_DIRECTORIESCMAKE_<LANG> _IMPLICIT_LINK_LIBRARIESCMAKE_<LANG> _LIBRARY_ARCHITECTURECMAKE_<LANG> _LINKER_PREFERENCECMAKE_<LANG> _LINKER_PREFERENCE_PROPAGATESCMAKE_<LANG> _LINK_EXECUTABLECMAKE_<LANG> _OUTPUT_EXTENSIONCMAKE_<LANG> _PLATFORM_IDCMAKE_<LANG> _SIMULATE_IDCMAKE_<LANG> _SIMULATE_VERSIONCMAKE_<LANG> _SIZEOF_DATA_PTRCMAKE_<LANG> _SOURCE_FILE_EXTENSIONSCMAKE_<LANG> _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<LANG> CMAKE_COMPILE_PDB_OUTPUT_DIRECTORYCMAKE_COMPILE_PDB_OUTPUT_DIRECTORY_<CONFIG> 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_<PackageName> CMAKE_DL_LIBSCMAKE_EDIT_COMMANDCMAKE_ERROR_DEPRECATEDCMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATIONCMAKE_EXECUTABLE_SUFFIXCMAKE_EXE_LINKER_FLAGSCMAKE_EXE_LINKER_FLAGS_<CONFIG> 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_<CONFIG> CMAKE_MATCH_COUNTCMAKE_MFC_FLAGCMAKE_MINIMUM_REQUIRED_VERSIONCMAKE_MINOR_VERSIONCMAKE_MODULE_LINKER_FLAGSCMAKE_MODULE_LINKER_FLAGS_<CONFIG> 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_<CONFIG> CMAKE_POLICY_DEFAULT_CMP<NNNN> CMAKE_POLICY_WARNING_CMP<NNNN> CMAKE_POSITION_INDEPENDENT_CODECMAKE_PREFIX_PATHCMAKE_PROGRAM_PATHCMAKE_PROJECT_<PROJECT-NAME> _INCLUDECMAKE_PROJECT_NAMECMAKE_RANLIBCMAKE_ROOTCMAKE_RUNTIME_OUTPUT_DIRECTORYCMAKE_SCRIPT_MODE_FILECMAKE_SHARED_LIBRARY_PREFIXCMAKE_SHARED_LIBRARY_SUFFIXCMAKE_SHARED_LINKER_FLAGSCMAKE_SHARED_LINKER_FLAGS_<CONFIG> 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_<CONFIG> 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_<LANG> 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_<an-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的帮助文档

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值