网站开发服务协议,会网站开发 不会软件,深圳装修公司生产厂家,做网站常用的套件1、CMake简介CMake是一个用于管理源代码的跨平台构建工具可以方便地根据目标平台和编译工具产生对应的编译文件主要用于C/C语言的构建#xff0c;但是也可以用于其它编程语言的源代码。如同使用make命令工具解析Makefile文件一样cmake命令工具依赖于一个CMakeLists.txt的文件该…1、CMake简介CMake是一个用于管理源代码的跨平台构建工具可以方便地根据目标平台和编译工具产生对应的编译文件主要用于C/C语言的构建但是也可以用于其它编程语言的源代码。如同使用make命令工具解析Makefile文件一样cmake命令工具依赖于一个CMakeLists.txt的文件该文件定义了代码的编译规则和目标等信息。官方文档说明https://cmake.org/cmake/help/v3.17/index.html2、CMake 注释单行注释 # # 单行注释多行注释 #[[ ]]#[[ 多行注释多行注释多行注释 ]]3、CMake 变量CMake 中所有变量都是 String 类型set() 声明变量# set(变量名 变量值)
set(name 小明)unset() 移除一个变量# unset(变量名)
unset(name)${} 引用变量# ${变量名}
${name}message() 打印变量# message(name ${变量名})
message(name ${name})4、CMake列表列表也是字符串可以把列表看做是一个特殊的变量这个变量有多个值。列表格式 (设置列表有两种方式)# set(列表名 值1 值2 ... 值n)
set(list_age 1 2 ... n)# set(列表名 值1; 值2; 值3)
set(list_age 1;2;3)5、CMake流程控制操作符优先级 一元 二元 逻辑类型名称一元EXIST、COMMAND、DEFINED二元EQUAL、LESS、LESS_EQUAL、GREATER、GREATER_EQUAL、STREQUAL、STRLESS、STRLESS_EQUAL、STRGREATER、STRGREATER_EQUAL、VERSION_EQUAL、VERSION_LESS、VERSION_LESS_EQUAL、VERSION_GREATER、VERSION_GREATER_EQUAL、MATCHES布尔常量值类型值true1、ON、YES、TRUE、Y、非0的值false0、OFF、NO、FALSE、N、IGNORE、NOTFOUND空字符串、一-NOTFOUND结尾的字符串条件判断 if()语法if(表达式)....
elseif(表达式)...
else(表达式)...
endif() elseif和else部分是可选的elseif部分可以有多个缩进和空格对语句的解析没有影响循环命令 while()语法while(表达式)...
endwhile() break() 可以跳出整个循环 continue() 可以跳出当前循环循环遍历 foreach()循环遍历分为两种遍历RANGE:#循环范围从start到stop循环增量为step
foreach(循环变量 RANGE start stop step)...
endforeach(循环变量)遍历LISTS:foreach(循环遍历 IN LISTS 列表)...
endforeach(循环变量) break() 可以跳出整个循环 continue() 可以跳出当前循环6、CMake自定义函数语法function(name arg1 arg2 arg3)...
endfunction(name)调用name(arg1 arg2 arg3)7、CMake自定义宏命令语法macro(name arg1 arg2 arg3)...
endmacro(name)调用name(arg1 arg2 arg3)8、CMake常用变量CMake预设了一些常用变量这些变量通常会在编写CMakeLists.txt文件时使用到变量值作用CMAKE_MAJOR_VERSIONcmake 主版本号CMAKE_MINOR_VERSIONcmake 次版本号CMAKE_C_FLAGS设置 C 编译选项CMAKE_CXX_FLAGS设置 C 编译选项PROJECT_SOURCE_DIR工程的根目录PROJECT_BINARY_DIR运行 cmake 命令的目录CMAKE_CURRENT_SOURCE_DIR当前CMakeLists.txt 所在路径CMAKE_CURRENT_BINARY_DIR目标文件编译目录EXECUTABLE_OUTPUT_PATH重新定义目标二进制可执行文件的存放位置LIBRARY_OUTPUT_PATH重新定义目标链接库文件的存放位置UNIX 如果为真表示为UNIX-like的系统包括AppleOSX和CygWinWIN32如果为真表示为 Windows 系统包括 CygWinAPPLE如果为真表示为 Apple 系统CMAKE_SIZEOF_VOID_P表示void*的大小例如为4或者8可以使用其来判断当前构建为32位还是64位CMAKE_CURRENT_LIST_DIR表示正在处理的CMakeLists.txt文件所在目录的绝对路径CMAKE_ARCHIVE_OUTPUT_DIRECTORY用于设置ARCHIVE目标的输出路径CMAKE_LIBRARY_OUTPUT_DIRECTORY用于设置LIBRARY目标的输出路径CMAKE_RUNTIME_OUTPUT_DIRECTORY用于设置RUNTIME目标的输出路径9、CMakeLists.txt 常用语法project 命令# 命令语法:project(projectname [languageName1 languageName2 ...])
# 设置项目名称 工程名称为 projectName
project(projectName)cmake_minimum_required 命令# cmake_minimum_requried(VERSION major[.minor[.patch)
# 设置 CMake 最低版本 最低版本 3.14
cmake_minimum_required(VERSION 3.14.0)aux_source_directory命令:# aux_source_directory(dir variable)
# 用于包含源文件目录dir目录下的所有源文件的名字保存在变量variable中
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src DIR_SRCS)add_executable命令:# add_executable(name [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL] source1 source2 … sourceN)
# 用于指定从一组源文件source1 source2 ... sourceN 编译出一个可执行文件且命名为name
add_executable(Main $(DIR_SRCS))add_library命令:# add_library([STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1source2 … sourceN)
# 用于指定从一组源文件 source1 source2 ... sourceN编译出一个库文件且命名为name
add_library(Lib $(DIR_SRCS))add_dependencies命令:# add_dependencies(target-name depend-target1 depend-target2 …)
# 用于指定某个目标可执行文件或者库文件依赖于其他的目标。
# 这里的目标必须是add_executable、add_library、add_custom_target命令创建的目标 add_subdirectory命令:# add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
# 用于添加一个需要进行构建的子目录
add_subdirectory(Lib)target_link_libraries命令:# target_link_libraries(target [item1 [item2 […]]][[debug|optimized|general] ] …)
# 用于指定target需要链接item1 item2 ...。这里target必须已经被创建链接的item可以是已经存在的target依赖关系会自动添加
target_link_libraries(Main Lib)set命令# 用于设定变量 variable 的值为 value。如果指定了 CACHE 变量将被放入 Cache缓存中。
# set(variable value [[CACHE typedocstring [FORCE]] | PARENT_SCOPE])
set(ProjectName Main)unset命令# unset(variable [CACHE])
# 用于移除变量 variable。如果指定了 CACHE 变量将被从 Cache 中移除。
unset(VAR CACHE)message命令# message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] “message todisplay”…)
# 用于输出信息
message(“Hello World”)include_directories命令# include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)
# 用于设定目录这些设定的目录将被编译器用来查找 include 文件
include_directories(${PROJECT_SOURCE_DIR}/lib)find_path命令# find_path(VAR name1 [path1 path2 …])
# 用于查找包含文件name1的路径如果找到则将路径保存在VAR中此路径为一个绝对路径如果没有找到则结果为VAR-NOTFOUND.默认情况下VAR会被保存在Cache中这时候我们需要清除VAR才可以进行下一次查询使用unset命令
find_path(LUA_INCLUDE_PATH lua.h ${LUA_INCLUDE_FIND_PATH})
if(NOT LUA_INCLUDE_PATH)message(SEND_ERROR Header file lua.h not found)
endif()find_library命令# find_library(VAR name1 [path1 path2 …])
# 用于查找库文件 name1 的路径如果找到则将路径保存在 VAR 中此路径为一个绝对路径
# 如果没有找到则结果为 VAR-NOTFOUND。
# 一个类似的命令 link_directories 已经不太建议使用了add_definitions命令# add_definitions(-DFOO -DBAR …)
# 用于添加编译器命令行标志选项通常的情况下我们使用其来添加预处理器定义
add_definitions(-D_UNICODE -DUNICODE) file命令# 此命令提供了丰富的文件和目录的相关操作这里仅说一下比较常用的
使用范例
# 目录的遍历
# GLOB 用于产生一个文件目录路径列表并保存在variable 中
# 文件路径列表中的每个文件的文件名都能匹配globbing expressions非正则表达式但是类似
# 如果指定了 RELATIVE 路径那么返回的文件路径列表中的路径为相对于 RELATIVE 的路径
file(GLOB variable [RELATIVE path][globbing expressions]...)# 获取当前目录下的所有的文件目录的路径并保存到 ALL_FILE_PATH 变量中
file(GLOB ALL_FILE_PATH ./*)
# 获取当前目录下的 .h 文件的文件名并保存到ALL_H_FILE 变量中
# 这里的变量CMAKE_CURRENT_LIST_DIR 表示正在处理的 CMakeLists.txt 文件的所在的目录的绝对路径2.8.3 以及以后版本才支持