突破编程_C++_CMake(常用变量)

常用变量

变量说明

  • PROJECT_SOURCE_DIR
    PROJECT_SOURCE_DIR代表当前项目根目录的路径。当使用project命令指定项目名称时,CMake会自动设置PROJECT_SOURCE_DIR的默认值为项目根目录的路径(CMakeLists.txt所在的路径)。如果使用的是子目录CMakeLists.txt,那么PROJECT_SOURCE_DIR将会是子目录的路径。
    (注:如果没有使用project命令指定项目名称,该变量为空)
  • PROJECT_BINARY_DIR
    PROJECT_SOURCE_DIR代表当前项目构建目录的路径。默认路径是 ${CMAKE_BINARY_DIR},即 CMake 运行时生成的默认构建目录。默认情况下,它与源代码目录平行,即为${PROJECT_SOURCE_DIR}/build。不过,也可以使用 -B 参数在运行 CMake 时指定其他构建目录。
    (注:如果没有使用project命令指定项目名称,该变量为空)
  • CMAKE_SOURCE_DIR
    最外层CMakeLists.txt所在目录。
  • CMAKE_BINARY_DIR
    与最外层CMakeLists.txt所在目录平级。即为${CMAKE_SOURCE_DIR}/build。
  • CMAKE_CURRENT_SOURCE_DIR
    当前运行CMakeLists.txt所在目录。
  • CMAKE_CURRENT_BINARY_DIR
    与当前CMakeLists.txt所在目录平级。即为${CMAKE_SOURCE_DIR}/build。
  • CMAKE_CURRENT_LIST_FILE
    当前正在处理的CMakeLists.txt的完整路径和文件名。即为${CMAKE_CURRENT_SOURCE_DIR}/CMakeLists.txt。
  • CMAKE_CURRENT_LIST_LINE
    当前正在处理的 CMakeLists.txt 的行号。
  • CMAKE_MODULE_PATH
    用于指定额外的CMake模块路径的变量。在使用CMake构建项目时,它会搜索这些路径以查找额外的模块文件。
    默认情况下,CMake会搜索一些标准模块路径来查找常见的模块文件。但是,有时你可能需要添加自定义的模块路径,例如为了包含自己编写的特定模块文件或引入第三方库提供的CMake模块。你可以使用set命令将自定义的模块路径添加到CMAKE_MODULE_PATH变量中,这样,在执行find_package等相关操作时,CMake就会先搜索这个自定义的模块路径,然后再搜索其他标准模块路径来查找所需的模块文件。
  • EXECUTABLE_OUTPUT_PATH
    目标二进制可执行文件的存放位置,如果产生的是可执行文件并且没有指定 CMAKE_RUNTIME_OUTPUT_DIRECTORY 则存放在该目录下。
  • LIBRARY_OUTPUT_PATH
    默认存放库文件的位置,如果产生的是静态库并且没有指定 CMAKE_ARCHIVE_OUTPUT_DIRECTORY 则存放在该目录下。如果产生的是动态库并且没有指定 CMAKE_LIBRARY_OUTPUT_DIRECTORY 则存放在该目录下。
  • CMAKE_CXX_STANDARD
    C++ 语言有不同版本的标准,如 C++ 98、C++ 11、C++ 14 等。不同标准提供的特性有所区别,故有必要在 CMakeLists.txt 中为项目指定使用何种标准,进而让 CMake 使用正确的编译器标志(比如 -std=c++11)。对于 CMake v3.1 以上版本,可以通过 CMAKE_CXX_STANDARD 变量指定标准,或通过 target_compile_features 函数根据使用的特性自动推断适用于目标的编译器标志。
    例如:
# 将 C++ 标准设置为 C++ 11
set(CMAKE_CXX_STANDARD 11)
  • CMAKE_CXX_STANDARD_REQUIRED
    CXX_STANDARD_REQUIRED 是一个布尔类型的变量,用于描述是否需要(强制)指定 CXX_STANDARD。当打开此选项,且当前使用的编译器不支持指定的标准时,会在 configuring 阶段报错失败,不会进行编译。
    例如:
# C++ 11 是强制要求,不会衰退至低版本
set(CMAKE_CXX_STANDARD_REQUIRED ON)  
  • CMAKE_CXX_EXTENSIONS
    经常与 CMAKE_CXX_STANDARD 一同设置,该属性用于指定是否使用编译器特有的扩展(即,不同的编译器在 C++ 标准之外自行实现的、非通用的特性)。对于某些编译器来说,启用此选项后会在编译行中添加特殊的标志,比如用 -std=gnu++11 替换 -std=c++11。该属性默认为 ON。如果某个项目对可移植性有较高的要求,可能为不同的平台使用不同的编译器,那么建议将其设置为 OFF。
    例如:
# 禁止使用编译器特有扩展 
set(CMAKE_CXX_EXTENSIONS OFF) 

样例

源码目录以及构建目录

./demo/
|--build
|--CMakeLists.txt
|--lib
|  |--CMakeLists.txt
|  |--libfunc.cpp
|--main.cpp

./demo/CMakeLists.txt的内容如下:

cmake_minimum_required (VERSION 3.22)

project (demo) 

message("demo_1.PROJECT_BINARY_DIR = ${PROJECT_BINARY_DIR}")
message("demo_2.PROJECT_SOURCE _DIR = ${PROJECT_SOURCE_DIR}")
message("demo_3.CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")
message("demo_4.CMAKE_BINARY_DIR = ${CMAKE_BINARY_DIR}")
message("demo_3.CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")
message("demo_4.CMAKE_CURRENT_BINARY_DIR = ${CMAKE_CURRENT_BINARY_DIR}")
message("demo_5.CMAKE_CURRENT_LIST_FILE = ${CMAKE_CURRENT_LIST_FILE}")
message("demo_6.CMAKE_CURRENT_LIST_LINE = ${CMAKE_CURRENT_LIST_LINE}")
message("demo_7.CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")

add_subdirectory(lib)

add_executable(${PROJECT_NAME} main.cpp)

./demo/lib/CMakeLists.txt的内容如下:

cmake_minimum_required (VERSION 3.22)

project (lib_1) 

message("demo_sub_1.PROJECT_BINARY_DIR = ${PROJECT_BINARY_DIR}")
message("demo_sub_2.PROJECT_SOURCE _DIR = ${PROJECT_SOURCE_DIR}")
message("demo_sub_3.CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")
message("demo_sub_4.CMAKE_BINARY_DIR = ${CMAKE_BINARY_DIR}")
message("demo_sub_3.CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")
message("demo_sub_4.CMAKE_CURRENT_BINARY_DIR = ${CMAKE_CURRENT_BINARY_DIR}")
message("demo_sub_5.CMAKE_CURRENT_LIST_FILE = ${CMAKE_CURRENT_LIST_FILE}")
message("demo_sub_6.CMAKE_CURRENT_LIST_LINE = ${CMAKE_CURRENT_LIST_LINE}")
message("demo_sub_7.CMAKE_SOURCE_DIR = ${CMAKE_SOURCE_DIR}")

add_library(${PROJECT_NAME} libfunc.cpp)

执行cmake

在***/demo/build路径下执行:

cmake ..

终端显示如下信息:

***:~/cmake_test/demo/build$ cmake ..
demo_1.PROJECT_BINARY_DIR = ***/cmake_test/demo/build
demo_2.PROJECT_SOURCE _DIR = ***/cmake_test/demo
demo_3.CMAKE_SOURCE_DIR = ***/cmake_test/demo
demo_4.CMAKE_BINARY_DIR = ***/cmake_test/demo/build
demo_3.CMAKE_CURRENT_SOURCE_DIR = ***/cmake_test/demo
demo_4.CMAKE_CURRENT_BINARY_DIR = ***/cmake_test/demo/build
demo_5.CMAKE_CURRENT_LIST_FILE = ***/cmake_test/demo/CMakeLists.txt
demo_6.CMAKE_CURRENT_LIST_LINE = 12
demo_7.CMAKE_SOURCE_DIR = ***/cmake_test/demo
demo_sub_1.PROJECT_BINARY_DIR = ***/cmake_test/demo/build/lib
demo_sub_2.PROJECT_SOURCE _DIR = ***/cmake_test/demo/lib
demo_sub_3.CMAKE_SOURCE_DIR = ***/cmake_test/demo
demo_sub_4.CMAKE_BINARY_DIR = ***/cmake_test/demo/build
demo_sub_3.CMAKE_CURRENT_SOURCE_DIR = ***/cmake_test/demo/lib
demo_sub_4.CMAKE_CURRENT_BINARY_DIR = ***/cmake_test/demo/build/lib
demo_sub_5.CMAKE_CURRENT_LIST_FILE = ***/cmake_test/demo/lib/CMakeLists.txt
demo_sub_6.CMAKE_CURRENT_LIST_LINE = 12
demo_sub_7.CMAKE_SOURCE_DIR = ***/cmake_test/demo
-- Configuring done
-- Generating done
-- Build files have been written to: ***/cmake_test/demo/build
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cmake_minimum_required(VERSION 3.8.0 FATAL_ERROR) project(mcu_kit VERSION 0.1.0 DESCRIPTION "mcu-kit SDK" LANGUAGES C ) set(PROJECT_BRIEF "vDiscovery") set(CMAKE_C_STANDARD 11) set(CMAKE_C_EXTENSIONS ON) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD 11) set(CMAKE_POSITION_INDEPENDENT_CODE ON) add_compile_options(-Wall) list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") include(CMakePrintHelpers) include(ConfigureChecks) if(EXISTS "${PROJECT_SOURCE_DIR}/config.cmake") include(config.cmake) else() message(FATAL_ERROR "Can't find cmake.config file") endif() if(${CMAKE_CROSSCOMPILING}) set(LV_SIMULATOR_ON_PC OFF) else() set(LV_SIMULATOR_ON_PC ON) endif() configure_file( "${PROJECT_SOURCE_DIR}/base/base_sdk_version.h.in" "${PROJECT_SOURCE_DIR}/base/base_sdk_version.h" ) configure_file( "${PROJECT_SOURCE_DIR}/base/base_config.h.in" "${PROJECT_SOURCE_DIR}/base/base_config.h" ) set(CMAKE_INSTALL_BINDIR ${CMAKE_INSTALL_PREFIX}/bin) set(CMAKE_INSTALL_SBINDIR ${CMAKE_INSTALL_PREFIX}/sbin) set(CMAKE_INSTALL_LIBDIR ${CMAKE_INSTALL_PREFIX}/lib) set(CMAKE_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_PREFIX}/include) set(CMAKE_INSTALL_SYSCONFDIR ${CMAKE_INSTALL_PREFIX}/etc) set(CMAKE_INSTALL_SHARESTATEDIR ${CMAKE_INSTALL_PREFIX}/com) set(CMAKE_INSTALL_LOCALSTATEDIR ${CMAKE_INSTALL_PREFIX}/var) set(CMAKE_INSTALL_INFODIR ${CMAKE_INSTALL_PREFIX}/info) set(CMAKE_INSTALL_LOCALEDIR ${CMAKE_INSTALL_PREFIX}/locate) set(CMAKE_INSTALL_MANDIR ${CMAKE_INSTALL_PREFIX}/man) set(CMAKE_INSTALL_DOCDIR ${CMAKE_INSTALL_PREFIX}/doc) set(CMAKE_INSTALL_RESDIR ${CMAKE_INSTALL_PREFIX}) include(PrepareInstall) set(KIT_ROOT_DIR ${CMAKE_SOURCE_DIR}) add_subdirectory("base") # add_subdirectory("third-party") add_subdirectory("lib") add_subdirectory("drivers") add_subdirectory("framework") add_subdirectory("sysapp") add_subdirectory("app") include(GeneratePkgConfig) include(Linux-kitInfo)详细注释一下这段代码
05-25
这段代码是一个 CMakeLists.txt 文件,用于构建一个名为 "mcu_kit" 的项目。下面是对每行代码的详细注释: ```cmake cmake_minimum_required(VERSION 3.8.0 FATAL_ERROR) ``` 指定最低的 CMake 版本,如果当前版本不符合要求,则提示错误。 ```cmake project(mcu_kit VERSION 0.1.0 DESCRIPTION "mcu-kit SDK" LANGUAGES C) ``` 定义项目名称、版本、描述和使用的编程语言。 ```cmake set(PROJECT_BRIEF "vDiscovery") ``` 设置一个变量,用于描述项目简介。 ```cmake set(CMAKE_C_STANDARD 11) set(CMAKE_C_EXTENSIONS ON) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD 11) ``` 指定使用的 C 和 C++ 标准版本。 ```cmake set(CMAKE_POSITION_INDEPENDENT_CODE ON) ``` 启用位置独立代码(PIC)选项。 ```cmake add_compile_options(-Wall) ``` 添加编译选项,这里添加了 -Wall 选项,表示开启所有警告。 ```cmake list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") ``` 将自定义的 CMake 模块路径添加到 CMAKE_MODULE_PATH 变量中。 ```cmake include(CMakePrintHelpers) include(ConfigureChecks) ``` 包含两个自定义的 CMake 模块,用于输出调试信息和配置检查。 ```cmake if(EXISTS "${PROJECT_SOURCE_DIR}/config.cmake") include(config.cmake) else() message(FATAL_ERROR "Can't find cmake.config file") endif() ``` 如果存在 config.cmake 文件,则包含它,否则输出错误信息并停止构建。 ```cmake if(${CMAKE_CROSSCOMPILING}) set(LV_SIMULATOR_ON_PC OFF) else() set(LV_SIMULATOR_ON_PC ON) endif() ``` 根据交叉编译标志设置变量 LV_SIMULATOR_ON_PC。如果正在交叉编译,则设置为 OFF;否则设置为 ON。 ```cmake configure_file( "${PROJECT_SOURCE_DIR}/base/base_sdk_version.h.in" "${PROJECT_SOURCE_DIR}/base/base_sdk_version.h" ) configure_file( "${PROJECT_SOURCE_DIR}/base/base_config.h.in" "${PROJECT_SOURCE_DIR}/base/base_config.h" ) ``` 配置文件模板,用于生成编译时需要的头文件。 ```cmake set(CMAKE_INSTALL_BINDIR ${CMAKE_INSTALL_PREFIX}/bin) set(CMAKE_INSTALL_SBINDIR ${CMAKE_INSTALL_PREFIX}/sbin) set(CMAKE_INSTALL_LIBDIR ${CMAKE_INSTALL_PREFIX}/lib) set(CMAKE_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_PREFIX}/include) set(CMAKE_INSTALL_SYSCONFDIR ${CMAKE_INSTALL_PREFIX}/etc) set(CMAKE_INSTALL_SHARESTATEDIR ${CMAKE_INSTALL_PREFIX}/com) set(CMAKE_INSTALL_LOCALSTATEDIR ${CMAKE_INSTALL_PREFIX}/var) set(CMAKE_INSTALL_INFODIR ${CMAKE_INSTALL_PREFIX}/info) set(CMAKE_INSTALL_LOCALEDIR ${CMAKE_INSTALL_PREFIX}/locate) set(CMAKE_INSTALL_MANDIR ${CMAKE_INSTALL_PREFIX}/man) set(CMAKE_INSTALL_DOCDIR ${CMAKE_INSTALL_PREFIX}/doc) set(CMAKE_INSTALL_RESDIR ${CMAKE_INSTALL_PREFIX}) ``` 设置安装目录的各个子目录。 ```cmake include(PrepareInstall) ``` 包含一个自定义的 CMake 模块,用于准备安装目录。 ```cmake set(KIT_ROOT_DIR ${CMAKE_SOURCE_DIR}) ``` 设置变量 KIT_ROOT_DIR 的值为源代码目录。 ```cmake add_subdirectory("base") add_subdirectory("lib") add_subdirectory("drivers") add_subdirectory("framework") add_subdirectory("sysapp") add_subdirectory("app") ``` 添加子目录,用于构建项目的各个模块。每个子目录都包含了相应的 CMakeLists.txt 文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值