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