[CMake] Link Time Code Generation (LTGC) by default, for Release configurations of Visual Studio projects?
Niels Dekker
niels_dekker_address_until_2024 at xs4all.nl
Wed Jan 24 15:06:09 EST 2018
When a Visual C++ project is created within Visual Studio (by File menu,
New, Project...), it has Link Time Code Generation (LTGC) by default,
for its Release configurations: Compiler option /GL and linker option
/LTCG. However, when the Visual C++ project is generated by CMake, it
does not have LTGC, by default. LTCG looks like a very useful feature to
me. I think it's worth enabling the feature by default, for Release
configurations. What do you think?
Some details:
I created a "dummy" Visual C++ project in Visual Studio 2017 (Version
15.5.4), by File menu, New, Project..., and I also generated one by
CMake (version 3.10.2), using a very minimal CMakeLists.txt
The Visual C++ project created by Visual Studio 2017 has the following
compile options, by default, for Release (x64):
/permissive- /GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl
/Fd"x64\Release\vc141.pdb" /Zc:inline /fp:precise /D "_MBCS"
/errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /Fa"x64\Release\"
/EHsc /nologo /Fo"x64\Release\" /Fp"x64\Release\MyVS2015Project.pch"
/diagnostics:classic
And the following linker options:
/OUT:"F:\X\Src\MyProject\MyVS2015Project\x64\Release\MyVS2015Project.exe"
/MANIFEST /LTCG:incremental /NXCOMPAT
/PDB:"F:\X\Src\MyProject\MyVS2015Project\x64\Release\MyVS2015Project.pdb"
/DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib"
"comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib"
"uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG:FULL /MACHINE:X64 /OPT:REF
/PGD:"F:\X\Src\MyProject\MyVS2015Project\x64\Release\MyVS2015Project.pgd"
/MANIFESTUAC:"level='asInvoker' uiAccess='false'"
/ManifestFile:"x64\Release\MyVS2015Project.exe.intermediate.manifest"
/OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1
The vcxproj file created by Visual Studio has
"<WholeProgramOptimization>true</WholeProgramOptimization>" for its
Release configurations.
The Visual C++ project generated by CMake (Generator: Visual Studio 15
2017 Win64) has the following compile options, for its Release
configuration:
/GS /TP /W3 /Zc:wchar_t /Gm- /O2 /Ob2
/Fd"MyExecutable.dir\Release\vc141.pdb" /Zc:inline /fp:precise /D
"WIN32" /D "_WINDOWS" /D "NDEBUG" /D "CMAKE_INTDIR=\"Release\"" /D
"_MBCS" /errorReport:prompt /WX- /Zc:forScope /GR /Gd /MD /Fa"Release/"
/EHsc /nologo /Fo"MyExecutable.dir\Release\"
/Fp"MyExecutable.dir\Release\MyExecutable.pch" /diagnostics:classic
And the following linker options:
/OUT:"F:\X\Bin\vc141-64\MyProject\Release\MyExecutable.exe" /MANIFEST
/NXCOMPAT /PDB:"F:/X/Bin/vc141-64/MyProject/Release/MyExecutable.pdb"
/DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib"
"shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "comdlg32.lib"
"advapi32.lib"
/IMPLIB:"F:/X/Bin/vc141-64/MyProject/Release/MyExecutable.lib"
/MACHINE:X64 /INCREMENTAL:NO
/PGD:"F:\X\Bin\vc141-64\MyProject\Release\MyExecutable.pgd"
/SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'"
/ManifestFile:"MyExecutable.dir\Release\MyExecutable.exe.intermediate.manifest"
/ERRORREPORT:PROMPT /NOLOGO /TLBID:1
The vcxproj file generated by CMake does not have a
"<WholeProgramOptimization>" tag.
I hope you can consider adding LTCG to Release configurations of Visual
C++ projects generated by CMake, by default.
Kind regards, Niels
--
Niels Dekker
Scientific programmer
LKEB, Leiden University Medical Center
More information about the CMake
mailing list