Using cmake to build C++ with custom CMAKE_CXX_FLAGS on MSVC may result in a warning to Specify /EHsc.
Here is an example:
# CMakeLists.txt
cmake_minimum_required (VERSION 3.23)
project(ehsc)
add_executable(ehsc ehsc.cpp)
// ehsc.cpp
#include <iostream>
class NeedsDestruction {
public:
NeedsDestruction () {
std::cout << "Constructor called" << std::endl;
}
~NeedsDestruction () {
std::cout << "Destructor called" << std::endl;
}
};
void throws () {
NeedsDestruction nd;
throw std::exception("exception");
}
int main () {
try {
throws ();
} catch (std::exception e) {
std::cout << "caught exception" << std::endl;
}
}
Configure with a custom CMAKE_CXX_FLAGS:
cmake -S. -Bcmake-build -DCMAKE_CXX_FLAGS="/Wall"
cmake --build cmake-build --target ehsc
Building results in many warnings suggesting to Specify /EHsc:
warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
Why does specifying CMAKE_CXX_FLAGS result in this warning? Because cmake specifies default flags for MSVC.
Setting CMAKE_CXX_FLAGS appears to have the side-effect of overwriting the default MSVC flags set by cmake.
For example, if CMAKE_CXX_FLAGS is not set, this is the output of printing CMAKE_CXX_FLAGS with cmake 3.23.1 on my Windows machine:
CMAKE_CXX_FLAGS=/DWIN32 /D_WINDOWS /W3 /GR /EHsc
Excluding /EHsc from the build flags appears particularly problematic. /EHsc is the documented default for the exception handling model:
Use an /EH compiler option to specify the exception handling model to use in a C++ project. Standard C++ exception handling (/EHsc) is the default in new C++ projects in Visual Studio.
Without /EHsc, the destructor in the example is not called when the exception is thrown. Executing does not print the expected Destructor called:
throws ... begin
Constructor called
caught exception
Top comments (0)