[√]cmake 编译选项

简介: [√]cmake 编译选项

image.png

/external可以为文件指定编译器诊断行为

/external:I指定头文件目录

在cmake中

include_directories(dir)

发现再次引入相同的目录,并不会添加到附加包含目录

问题就在:哪里在添加这个编译选项?

set_property(TARGET myTag PROPERTY INTERFACE_COMPILE_DEFINITIONS '')

image.png

add_compile_options、add_definitions

CMAKE_INCLUDE_SYSTEM_FLAG_C

CMAKE_INCLUDE_SYSTEM_FLAG_CXX

  • --no-warn-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -Se:/proj/cmake -Be:/proj/cmake/build -G "Visual Studio 15 2017" -T host=x86 -A win32
  • --no-warn-unused-cli -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -Sc:/Users/cc/Documents/untitled1 -Bc:/Users/cc/Documents/untitled1/build -G "Visual Studio 16 2019" -T host=x64 -A win32

顺着源码一路追下去

  • E:\proj\cmake-3.25.1\Modules\CMakeCXXInformation.cmake : 25
# Load compiler-specific information.
if(CMAKE_CXX_COMPILER_ID)
  include(Compiler/${CMAKE_CXX_COMPILER_ID}-CXX OPTIONAL)
endif()
  • E:\proj\cmake-3.25.1\Modules\Compiler\MSVC-CXX.cmake : 5
include(Compiler/MSVC)
__compiler_msvc(CXX)
  • E:\proj\cmake-3.25.1\Modules\Compiler\MSVC.cmake
# The `/external:I` flag was made non-experimental in 19.29.30036.3.
# 我的是 19.29.30145.0
if (CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 19.29.30036.3)
    set(CMAKE_INCLUDE_SYSTEM_FLAG_${lang} "-external:I")
    set(_CMAKE_INCLUDE_SYSTEM_FLAG_${lang}_WARNING "-external:W0 ")
endif ()

查看编译器版本

  • message(${CMAKE_CXX_COMPILER_VERSION})

CMAKE_C_COMPILER

github.dev/Kitware/CMa…

 if (!this->LangForClCompile.empty()) {
    auto includeList = this->GetIncludes(configName, this->LangForClCompile);
    auto sysIncludeFlag = this->Makefile->GetDefinition(
      cmStrCat("CMAKE_INCLUDE_SYSTEM_FLAG_", this->LangForClCompile));
    if (sysIncludeFlag) {
      bool gotOneSys = false;
      for (auto i : includeList) {
        cmSystemTools::ConvertToUnixSlashes(i);
        if (this->GeneratorTarget->IsSystemIncludeDirectory(
              i, configName, this->LangForClCompile)) {
          auto flag = cmTrimWhitespace(*sysIncludeFlag);
          if (this->MSTools) {
            cmSystemTools::ReplaceString(flag, "-external:I", "/external:I");
          }
          clOptions.AppendFlagString("AdditionalOptions",
                                     cmStrCat(flag, " \"", i, '"'));
          gotOneSys = true;
        } else {
          clOptions.AddInclude(i);
        }
      }
      if (gotOneSys) {
        if (auto sysIncludeFlagWarning = this->Makefile->GetDefinition(
              cmStrCat("_CMAKE_INCLUDE_SYSTEM_FLAG_", this->LangForClCompile,
                       "_WARNING"))) {
          flags = cmStrCat(flags, ' ', *sysIncludeFlagWarning);
        }
      }
    } else {
      clOptions.AddIncludes(includeList);
    }
  }

CMAKE_CXX_FLAGS

message(${CMAKE_INCLUDE_SYSTEM_FLAG_CXX}) #-external:I

结论

当编译器使用的版本大于19.29.30036.3,并且设置为系统头文件目录

include_directories( SYSTEM ${CMAKE_CURRENT_LIST_DIR})

就会在编译器选项中通过external:I追加这个头文件目录

目录
相关文章
|
3月前
|
IDE Java Linux
【CMake】CMake构建C++代码(一)
【CMake】CMake构建C++代码(一)
|
3月前
|
编译器 Linux 调度
makfile的编译选项:CFLAGS、CPPFLAGS、LDFLAGS、LIBS
makfile的编译选项:CFLAGS、CPPFLAGS、LDFLAGS、LIBS
223 0
|
3月前
|
存储 自然语言处理 Linux
CMake基础(1)初识CMake
CMake基础(1)初识CMake
36 0
|
2月前
Clion-2023.1.4配置CMake-3.25.3
Clion-2023.1.4配置CMake-3.25.3
21 4
|
3月前
|
编译器 C语言 C++
CMake基础(9)使用Clang编译
CMake基础(9)使用Clang编译
219 0
|
3月前
|
编译器 Linux 开发者
【cmake 交叉编译配置设置】CMAKE_TOOLCHAIN_FILE:跨平台编译的秘密武器
【cmake 交叉编译配置设置】CMAKE_TOOLCHAIN_FILE:跨平台编译的秘密武器
288 0
|
11月前
|
C++
Cmake生成指定vs版本的工程文件
本文简单总结了使用 cmake 生成 visual studio 工程文件的过程
|
9月前
|
编译器 Android开发 iOS开发
[√]关于cmake的kits
[√]关于cmake的kits
94 0
|
9月前
|
Shell C++ Windows
[√]尝试使用cmake编译使用vld
[√]尝试使用cmake编译使用vld
86 0
|
Linux
LINUX编译cmake
LINUX编译cmake
90 0