常用环境变量 SET(ENV{VAR} VALUE) **常用变量** | 变量名 | 含义 | | ----------------------------- | --------------------------------------------------------------------- | | **PROJECT_NAME** | project命令中写的项目名 | | **CMAKE_VERSION** | 当前使用 CMake 的版本 | | **CMAKE_SOURCE_DIR** | 工程顶层目录即入口 CMakeLists 文件所在路径 | | **PROJECT_SOURCE_DIR** | 同**CMAKE_SOURCE_DIR** | | **CMAKE_BINARY_DIR** | 工程编译发生的目录即执行 cmake 命令进行项目配置的目录一般为 build | | **PROJECT_BINARY_DIR** | 同**CMAKE_BINARY_DIR** | | **CMAKE_CURRENT_SOURCE_DIR** | 当前处理的 CMakeLists.txt 所在的路径 | | **CMAKE_CURRRENT_BINARY_DIR** | 当前处理的 CMakeLists.txt 中生成目标文件所在编译目录 | | **CMAKE_CURRENT_LIST_FILE** | 输出调用这个变量的 CMakeLists.txt 文件的完整路径 | | **CMAKE_CURRENT_LIST_DIR** | 当前处理的 CMakeLists.txt 文件所在目录的路径 | | **CMAKE_INSTALL_PREFIX** | 指定make install命令执行时包安装路径 | | **CMAKE_MODULE_PATH** | find_package命令搜索包路径**之一**默认为空 | **编译配置相关变量** | 变量名 | 含义 | | ---------------------- | --------------------------------------------------------------------------------- | | **CMAKE_BUILD_TYPE** | 编译选项Release 或者 Debug如set(CMAKE_BUILD_TYPE Release) | | **CMAKE_CXX_FLAGS** | 编译标志设置 C11 编译set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -stdc11) | | **CMAKE_CXX_STANDARD** | 也可以设置 C11 编译set(CMAKE_CXX_STANDARD 11) | list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) # 依赖库fetch include(FetchContent) FetchContent_Declare( googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG release-1.8.0 ) FetchContent_GetProperties(googletest) if(NOT googletest_POPULATED) FetchContent_Populate(googletest) # ... # adds the targets: gtest, gtest_main, gmock, gmock_main add_subdirectory( ${googletest_SOURCE_DIR} ${googletest_BINARY_DIR} ) # ... endif() # 检测系统 if(CMAKE_SYSTEM_NAME STREQUAL Linux) message(STATUS Configuring on/for Linux) elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin) message(STATUS Configuring on/for macOS) elseif(CMAKE_SYSTEM_NAME STREQUAL Windows) message(STATUS Configuring on/for Windows) elseif(CMAKE_SYSTEM_NAME STREQUAL AIX) message(STATUS Configuring on/for IBM AIX) else() message(STATUS Configuring on/for ${CMAKE_SYSTEM_NAME}) endif() #ifdef IS_32_BIT_ARCH return arch_info std::string(Compiled on a 32 bit host processor.); #elif IS_64_BIT_ARCH return arch_info std::string(Compiled on a 64 bit host processor.); #else return arch_info std::string(Neither 32 nor 64 bit, puzzling ...); #endif if(CMAKE_SIZEOF_VOID_P EQUAL 8) target_compile_definitions(arch-dependent PUBLIC IS_64_BIT_ARCH) message(STATUS Target is 64 bits) else() target_compile_definitions(arch-dependent PUBLIC IS_32_BIT_ARCH) message(STATUS Target is 32 bits) endif() if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES i386) message(STATUS i386 architecture detected) elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES i686) message(STATUS i686 architecture detected) elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES x86_64) message(STATUS x86_64 architecture detected) else() message(STATUS host processor architecture is unknown) endif() target_compile_definitions(arch-dependent PUBLIC ARCHITECTURE${CMAKE_HOST_SYSTEM_PROCESSOR} ) #外部检测 execute_process( COMMAND ${PYTHON_EXECUTABLE} -c print(Hello, world!) RESULT_VARIABLE _status OUTPUT_VARIABLE _hello_world ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE ) message(STATUS RESULT_VARIABLE is: ${_status}) message(STATUS OUTPUT_VARIABLE is: ${_hello_world}) cmake -D PYTHON_EXECUTABLE/custom/location/python .. cmake -D BOOST_INCLUDEDIR/custom/boost/include -DBOOST_LIBRARYDIR/custom/boost/lib #配置生成源码 #include stdio.h #include unistd.h void print_info(void) { printf(\n); printf(Configuration and build information\n); printf(-----------------------------------\n); printf(\n); printf(Who compiled | %s\n, _user_name); printf(Compilation hostname | %s\n, _host_name); printf(Fully qualified domain name | %s\n, _fqdn); printf(Operating system | %s\n, _os_name, _os_release, _os_version); printf(Platform | %s\n, _os_platform); printf(Processor info | %s\n, _processor_name, _processor_description); printf(CMake version | %s\n, CMAKE_VERSION); printf(CMake generator | %s\n, CMAKE_GENERATOR); printf(Configuration time | %s\n, _configuration_time); printf(Fortran compiler | %s\n, CMAKE_Fortran_COMPILER); printf(C compiler | %s\n, CMAKE_C_COMPILER); printf(\n); fflush(stdout); } configure_file(print_info.c.in print_info.c ONLY) target_sources(example PRIVATE example.f90 ${CMAKE_CURRENT_BINARY_DIR}/print_info.c ) # 生成SDK include(GNUInstallDirs) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}) # Offer the user the choice of overriding the installation directories set(INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH Installation directory for libraries) set(INSTALL_BINDIR ${CMAKE_INSTALL_BINDIR} CACHE PATH Installation directory for executables) set(INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH Installation directory for header files) if(WIN32 AND NOT CYGWIN) set(DEF_INSTALL_CMAKEDIR CMake) else() set(DEF_INSTALL_CMAKEDIR share/cmake/${PROJECT_NAME}) endif() set(INSTALL_CMAKEDIR ${DEF_INSTALL_CMAKEDIR} CACHE PATH Installation directory for CMake files) # Report to user foreach(p LIB BIN INCLUDE CMAKE) file(TO_NATIVE_PATH ${CMAKE_INSTALL_PREFIX}/${INSTALL_${p}DIR} _path ) message(STATUS Installing ${p} components to ${_path}) unset(_path) endforeach() # rpath file(RELATIVE_PATH _rel ${CMAKE_INSTALL_PREFIX}/${INSTALL_BINDIR} ${CMAKE_INSTALL_PREFIX}) if(APPLE) set(_rpath loader_path/${_rel}) else() set(_rpath \$ORIGIN/${_rel}) endif() file(TO_NATIVE_PATH ${_rpath}/${INSTALL_LIBDIR} message_RPATH) set_target_properties(hello-world_wDSO PROPERTIES MACOSX_RPATH ON SKIP_BUILD_RPATH OFF BUILD_WITH_INSTALL_RPATH OFF INSTALL_RPATH ${message_RPATH} INSTALL_RPATH_USE_LINK_PATH ON ) install( TARGETS message-shared hello-world_wDSO ARCHIVE DESTINATION ${INSTALL_LIBDIR} COMPONENT lib RUNTIME DESTINATION ${INSTALL_BINDIR} COMPONENT bin LIBRARY DESTINATION ${INSTALL_LIBDIR} COMPONENT lib PUBLIC_HEADER DESTINATION ${INSTALL_INCLUDEDIR}/message COMPONENT dev ) if(WIN32 OR MINGW) list(APPEND CPACK_GENERATOR NSIS) set(CPACK_NSIS_PACKAGE_NAME message) set(CPACK_NSIS_CONTACT robertdr) set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) endif() message(STATUS CPack generators: ${CPACK_GENERATOR}) include(CPack) set(CPACK_SOURCE_GENERATOR TGZ;ZIP) set(CPACK_SOURCE_IGNORE_FILES /.git /dist /.*build.* /\\\\.DS_Store ) set(CMAKE_EXPORT_PACKAGE_REGISTRY ON) export(PACKAGE MyLib) #交叉编译 set(CMAKE_SYSTEM_NAME Windows) set(CMAKE_SYSTEM_PROCESSOR arm) set(CMAKE_C_COMPILER i686-w64-mingw32-gcc) set(CMAKE_CXX_COMPILER i686-w64-mingw32-g) set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang) set(CMAKE_Fortran_COMPILER i686-w64-mingw32-gfortran) #submodule find_package(Git QUIET) if(GIT_FOUND AND EXISTS ${PROJECT_SOURCE_DIR}/.git) # Update submodules as needed option(GIT_SUBMODULE Check submodules during build ON) if(GIT_SUBMODULE) message(STATUS Submodule update) execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} RESULT_VARIABLE GIT_SUBMOD_RESULT) if(NOT GIT_SUBMOD_RESULT EQUAL 0) message(FATAL_ERROR git submodule update --init --recursive failed with ${GIT_SUBMOD_RESULT}, please checkout submodules) endif() endif() endif() if(NOT EXISTS ${PROJECT_SOURCE_DIR}/extern/repo/CMakeLists.txt) message(FATAL_ERROR The submodules were not downloaded! GIT_SUBMODULE was turned off or failed. Please update submodules and try again.) endif()参考https://github.com/wx-chevalier/CMake-NotesCMake基础教程_cmake -b build-CSDN博客创作不易小小的支持一下吧
企业数字化 ERP 产品动态
相关推荐
Kornia 项目教程 Kornia 项目教程 【免费下载链接】kornia 🐍 Geometric Computer Vision Library for Spatial AI 项目地址: https://gitcode.com/GitHub_Trending/ko/kornia
项目的目录结构及介绍
Kornia 是一个基于 PyTorch 的几何计算机视觉库。以下是 Kornia 项目的主要… · 2026/11/4 15:54:22
C++ PCL kdtree /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 10:43:41
C++字体库开发之EM长度单位转换九 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 11:30:47
前端开发者的AI Agent转型指南:技能升级,价值翻倍! 本文探讨了AI Agent的兴起如何改变前端开发者的价值定位。虽然AI能自动化简单的前端工作,但异步思维、流式处理、组件化设计和用户交互理解等前端核心技能,正是AI Agent应用开发的关键。文章指出,前端开发者无需转行,只需升级现有… · 2026/11/5 10:07:35
从 OSI 七层模型到 TCP/IP 协议栈:深入理解网络通信的底层运行机制 一、今日学习概述
今天主要学习了 HCIE 网络基础中的两个核心知识体系: OSI 七层参考模型(Open Systems Interconnection) TCP/IP 四层参考模型(TCP/IP Protocol Suite)
在初步学习计算机网络时,我们通… · 2026/11/5 10:04:33
PDO属性设置全解析:高效数据库操作秘诀 PDO::关于PHP的PDO这种技术, 它有一份参考手册。PDO:: — 设置属性(PHP 5 > 5.1.0, PECL pdo > 0.1.0)说明语法bool PDO::setAttribute ( int $attribute , mixed $value )我们需要把数据库句柄的属性给设置好。在下文之中, 会列举出一些可以被大家所用到的通用的属性内容… · 2026/11/5 10:02:31
GMSK调制与基于Laurent分解的GMSK解调FPGA实现,第一篇(GMSK调制篇) 目录
一、GMSK简介
二、GMSK调制原理与步骤
1、GMSK调制原理
2、GMSK调制步骤
三、GMSK调制MATLAB仿真验证
1、GMSK调制MATLAB代码
2、GMSK调制MATLAB仿真
四、GMSK调制FPGA实现
1、GMSK调制FPGA Verilog代码
2、GMSK调制FPGA 仿真
五、FPGA和MATLAB联合仿真
1、… · 2026/11/5 10:02:31
JAVA——抽象类、内部类和接口 一、抽象类如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类可以包含抽象方法与普通方法和属性。在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽… · 2026/11/5 10:02:31
二叉树的学习 二叉树
1.树形概念
想了解二叉树的概念我们得先知道数的概念
树是⼀种⾮线性的数据结构,它是由n(n>0)个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,⽽叶朝下… · 2026/11/5 10:02:31
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
多智能体协作系统架构设计与实践优化 1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39
大模型系统性入门实战指南:从原理到部署微调的全链路路线 提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39
鸿蒙文件系统沙箱机制解析与开发实践 1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38