/external
可以为文件指定编译器诊断行为
/external:I
指定头文件目录
在cmake中
include_directories(dir)
发现再次引入相同的目录,并不会添加到附加包含目录
问题就在:哪里在添加这个编译选项?
set_property(TARGET myTag PROPERTY INTERFACE_COMPILE_DEFINITIONS '')
add_compile_options、add_definitions
- CMake模板文件: www.cnblogs.com/gaox9732949…
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
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
追加这个头文件目录