网站建设有哪些公司wordpress文章公众号
- 作者: 五速梦信息网
- 时间: 2026年04月20日 07:43
当前位置: 首页 > news >正文
网站建设有哪些公司,wordpress文章公众号,个人可以采集视频做网站吗,青岛网站制作服务商cmake 是一个跨平台编译工具#xff0c;它面向各种平台提供适配的编译系统配置文件#xff0c;进而调用这些编译系统完成编译工作。cmake 进入3.x 版本#xff0c;指令大量更新#xff0c;一些老的指令开始被新的指令集替代#xff0c;并加入了一些更加高效的指令/参数。本… cmake 是一个跨平台编译工具它面向各种平台提供适配的编译系统配置文件进而调用这些编译系统完成编译工作。cmake 进入3.x 版本指令大量更新一些老的指令开始被新的指令集替代并加入了一些更加高效的指令/参数。本文归纳了cmake 3.x 版本的常用指令方便使用时备查。 关于cmake工具的简单介绍和VS Code cmake Tools 环境配置可以参考我的另一篇博客。本文参考资料【公开课】现代CMake高级教程 - Bilibili 小彭老师CMake Reference Documentation ps: 本文是大全类文档适合备查完整学习cmake强烈建议跟随官方tutorial会有非常好的效果 cmake 项目构建流程
典型的cmake 项目构建流程如下 配置阶段 Configure根据编写的CmakeLists.txt文件以及选择的编译系统生成该系统的构建规则文件。例如对make生成Makefile对MSVC生成sln(可以在VS中打开) cmake -B build以上指令可以在当前目录下创建build目录而不需要事先创建并进入通过-D设置缓存变量格式-DOPTIONVALUE如: 编译器路径CMAKE_C_COMPILTER, CMAKE_CXX_COMPILER 等安装路径在Configure阶段配置CMAKE_INSTALL_PREFIX构建模式CMAKE_BUILD_TYPE自定义缓存变量-Dvar:typevalue可以将option设定为OFF即表示不启用会覆盖CMakeLists中的默认选项 -G指定生成器Generator即构建系统可以通过–help查看支持的列表 -A 指定架构For MSVC build system-T 指定工具链例如使用ClangCL: -T ClangCL,hostx64 (For MSVC build system)推荐使用Ninja作为生成器效率较高 编译阶段 Build根据生成的构建规则调用构建系统进行构建这一步真正输出项目目标可执行文件、共享库等 cmake –build build构建完成后可以在build目录下找到输出结果MSVC并不是直接放在build下而是在构建模式对应目录下Debug, Release这与其他不同
项目配置变量
项目配置变量是控制项目构建以及包含项目信息的关键变量。这些变量可以在命令行配置缓存变量也可以在CMakeLists内部修改。
项目构建模式
一般有四种项目构建模式
Debug 调试模式不优化生成调试信息 -O0 -gRelease 发布模式最优化性能最佳 -O3 -DNDEBUGMinSizeRel 最小体积发布 生成项目文件小性能优化不完全 -Os -DNDEBUGRelWithDebInfo 带调试信息发布 -O2 -g -DNDEBUG默认为Debug模式
可以通过在CMakeLists中增加默认选项脚本的方法修改默认选项为Release
if (NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE Release)
endif()项目信息
使用命令project初始化项目信息
project(PROJECT-NAME [language-name…])
project(PROJECT-NAME[VERSION major[.minor[.patch[.tweak]]]][DESCRIPTION project-description-string][HOMEPAGE_URL url-string][LANGUAGES language-name…])language: 指定项目使用语言默认C CXX 支持C CXX ASM FORTRAN CUDA OBJC OBJCXX ISPC VERSION 字段设置项目版本号会自动配置相关变量
该命令将初始化名为project_name的项目并给相关变量赋值
PROJECT_NAME: 项目名称CMAKE_PROJECT_NAME根项目名称PROJECT_SOURCE_DIR项目源码路径即初始化project的CMakeLists.txt所在路径PROJECT_BINARY_DIR项目输出路径通常是./build路径CMAKE_CURRENT_SOURCE_DIR当前源码路径CMAKE_CURRENT_BINARY_DIR当前输出路径即当前CMakeLists.txt所在路径子模块中指子模块路径更多属性请参考project — CMake 3.25.1 Documentation
项目语言标准
一般通过如下指令设置标准推荐放在project指令前会在project语言启用时检测
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)设置C标准为C11, C设置CXX对应属性CMAKE_C_STANDARD_REQUIRED 在启用语言时检查编译器是否支持该标准CMAKE_C_EXTENSIONS 是否启用GNU拓展语言特性对跨平台有影响
添加构建目标
构建目标主要有两种类型
可执行文件 executable
使用add_executable命令添加可执行文件目标
add_executable(name [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL][source1] [source2 …])添加一个name的可执行文件目标源文件来自source 可以是列表或者空格分开的多个文件名也可以是变量\({var_name}目录的所有文件可以使用 aux_source_directory添加 其中source可以省略(3.11)并在后面以target_sources的形式给出
库 library
add_library(name [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL][source...])STATIC/SHARED 指定生成静态库/动态库默认静态
另外还有对象库object library
add_library(name OBJECT [source...])对象库不输出实际的库文件而是可以直接被加入到其他构建目标中如 add_library(... \)TARGET_OBJECTS:objlib …)
add_executable(… \(TARGET_OBJECTS:objlib ...)或者使用target_link_libraries()链接到对象库(CMAKE 3.12) 注意动态库不能直接引用静态库因为动态库开启PIC而静态库没有 解决方案使用对象库替代静态库或者为静态库配置PICset_property(TARGET target_name PROPERTY POSITION_INDEPENDENT_CODE ON)另外Windows平台如果要使用动态库则需要添加宏 声明前添加 #ifdef _MSC_VER__declspce(dllimport)
#endif定义前加 #ifdef _MSC_VER__declspce(dllexport)
#endif配置构建目标
设置对象属性
set_target_properties(target_name PROPERTIESproperty_name value...)使用set_target_properties设置编译目标属性
这些属性包括详细信息参考cmake-properties(7) — CMake 3.25.1 Documentation
语言标准版本编译器设置目标输出位置*_OUTPUT_DIRECTORY
链接三方库
使用target_link_libraries()链接第三方库
target_link_libraries(target ... item... ...)其中item可以是
库对象名使用add_library( IMPORTED)引入指向库文件的完整路径库文件名这会调用链接器自动搜索在Linux下可以依据lib搜索
优化方案对使用cmake的三方库限Linux
find_package(LIBRARY_NAME REQUIRED)
target_link_libraries(target [PUBLIC] LIBRARY_NAME::library_target_name)使用find_package会在/usr/lib/cmake下增加.cmake配置文件cmake会自动搜索并链接相应的库。另外在链接库的时候还会按照配置文件进行引用传播引用其的对象自动引用其头文件目录。
编译时定义
使用target_compile_definitions来配置编译时宏定义这些定义可以在C/C的宏中被使用
target_compile_definitions(target PUBLIC def)将def设置到target的编译过程中
安装 install
install(TARGETS target... [destination])以上命令用于安装对象到destination
子命令还可以是
FILES 安装文件如头文件等DIRECTORY 目录详见install — CMake 3.25.1 Documentation
部署 ctest
使用enable_testing以启用ctestctest会自动执行命令并匹配输出自动化完成测试
以下示例增加一个ctest并设置匹配的输出结果
add_test(NAME Usage COMMAND Tutorial)
set_tests_properties(UsagePROPERTIES PASS_REGULAR_EXPRESSION Usage:.*number)如果程序输出Usage:[any]number就算正确通过
还可以将测试集写为函数增强代码复用性
function (do_test target arg result)add_test(NAME Comp\){arg} COMMAND \({target} \){arg})set_tests_properties(Comp\({arg}PROPERTIES PASS_REGULAR_EXPRESSION \){arg} is \({result})
endfunction()function (do_math_test target)do_test(\){target} 4 2)do_test(\({target} -25 (-nan|nan|0))
endfunction()
do_math_test(Tutorial)Scripting Commands
cmake命令不区分大小写不过小写命令更推荐使用cmake 变量参数等区分大小写
基础设置变量
使用set命令来设置变量
set(variable value... [PARENT_SCOPE])如果value为空格分隔的字符串不加引号则被认为是列表列表也可以用a;b以分号分隔加引号等效
CMakeLists 文件结构
通常情况下CMakeLists文件结构如下所示
cmake_minimum_required(VERSION 3.0)project(project_name)...cmake_minimum_required指定了该项目生成需要的最小版本project()指定项目名称该命令以下部分都是该项目的配置
批量添加文件
aux_source_directory(variable source_dir)此命令将添加source_dir下的所有匹配文件到variable中。匹配文件根据项目语言决定
文件操作指令 file是cmake中的文件操作指令可以完成复制、创建等一系列工作也可以用于查找文件 file(GLOB variable CONFIGURE_DEPENDS globbing-expressions)CONFIGURE_DEPENDS可以在文件更新时自动更新cmake后面是查找文件的表达式可以是通配符如*.cpp *.h等 configure_file 可以完成文件配置按照模板文件生成目标文件 configure_file(Config.h.in \){PROJECT_SOURCE_DIR}/Config.h)该命令会将模板文件Config.h.in中内容替换为实际配置内容并将头文件写入source目录下的Config.h中这样可以完成对文件内容的修改如启用选项编辑#define常量或其他宏补全效果。 常用模板格式如下 #define FOO_STR FOO_STR
#cmakedefine FOO_ENABLE该命令会将号包含的部分转换为cmake 执行环境中变量使用cmakedefine如果cmake环境中存在变量则会将其修改为#define FOO_ENABLE 即如果在CMakeLists中设置 set(FOO_STR Hello world)
option(FOO_ENABLE True)则模板文件中的定义将被输出为 #define FOO_STR Hello world
#define FOO_ENABLE输出字符串
使用message命令输出字符串
message([mode] message text …)其中模式可以为下列等
STATUS 状态信息前面带–WARNING 警告信息黄色警告FATAL_ERROR 致命错误INFO 默认前面不带任何白色输出到stderr
列表 list
使用list命令来构建操作列表
Readinglist(LENGTH list out-var)list(GET list element index [index …] out-var)list(JOIN list glue out-var)list(SUBLIST list begin length out-var)Searchlist(FIND list value out-var)Modificationlist(APPEND list [element…])list(FILTER list {INCLUDE | EXCLUDE} REGEX regex)list(INSERT list index [element…])list(POP_BACK list [out-var…])list(POP_FRONT list [out-var…])list(PREPEND list [element…])list(REMOVE_ITEM list value…)list(REMOVE_AT list index…)list(REMOVE_DUPLICATES list)list(TRANSFORM list ACTION […])Orderinglist(REVERSE list)list(SORT list […])详见list — CMake 3.25.1 Documentation下一小节会有应用选项的列表操作
选项 option
使用option来生成选项这些选项会在ccmake或cmake-gui中被显示
option(VAR_NAME [Description] [default_value])option中的默认选项会被命令行中的-D选项覆盖
例如
option(USE_MYMATH Enable MyMath Library True)在cmake-gui中会显示如下并可以被配置 一般项目情形下需要使用option来控制某个子功能是否启动可以使用以下命令(接上例USE_MYMATH)
if (USE_MYMATH)add_subdirectory(MathFunctions)list(APPEND EXTRA_LIBS MathFunctions)list(APPEND EXTRA_INCLUDES MathFunctions)
endif()如果选项中启用USE_MYMATH才会进行库引用
生成器表达式
使用生成器表达式可以简化指令
$\(var_name:value:statement只有在变量值时才会表现为statement否则生成器表达式的值为空
变量与作用域
默认变量传播规则parent-child
如果要child-parent则增加选项PARENT_SCOPE
Usage Requirements
在外部引用项目时需要满足一些特定条件这些条件称为usage requirements
只要项目开发者编写Usage Requirements使用者就可以直接通过link完成寻找包和链接功能而不需要另外的配置添加include等是现代cmake的主要构成。
同时这些引用也是会传递的不需要进行额外配置但要保证配置正确
在配置项目时一般有三种配置选项PRIVATE|PUBLIC|INTERFACE其中PRIVATE仅限于项目自身编译时使用INTERFACE是Usage Requirements它要求所有使用该库的项目添加该动作。PUBLIC则是两者兼有。
例如
add_library(MathFunctions mysqrt.cxx)
target_include_directories(MathFunctions INTERFACE \){CMAKE_CURRENT_SOURCE_DIR})以上指令会使所有引用该库(MathFunctions)的项目自动引用该项目的头文件
- 上一篇: 网站建设友汇做网站的团队
- 下一篇: 网站建设有哪些项目html表格编辑器
相关文章
-
网站建设友汇做网站的团队
网站建设友汇做网站的团队
- 技术栈
- 2026年04月20日
-
网站建设游戏开发网站域名价值查询
网站建设游戏开发网站域名价值查询
- 技术栈
- 2026年04月20日
-
网站建设优化之优化关键字深圳营销型网站建设
网站建设优化之优化关键字深圳营销型网站建设
- 技术栈
- 2026年04月20日
-
网站建设有哪些项目html表格编辑器
网站建设有哪些项目html表格编辑器
- 技术栈
- 2026年04月20日
-
网站建设有那些软件网站icp备案时间
网站建设有那些软件网站icp备案时间
- 技术栈
- 2026年04月20日
-
网站建设有前景吗校园类网站建设
网站建设有前景吗校园类网站建设
- 技术栈
- 2026年04月20日
