[√]cmake 编译选项

181 阅读1分钟

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追加这个头文件目录